java多线程之线程池
java多线程之线程池
池化技术
程序的运行,其本质上,是对系统资源(CPU、内存、磁盘、网络等等)的使用。如何高效的使用这些资源是我们编程优化演进的一个方向。今天说的线程池就是一种对CPU利用的优化手段。
通过学习线程池原理,明白所有池化技术的基本设计思路。遇到其他相似问题可以解决。
1 池化技术
前面提到一个名词——池化技术,那么到底什么是池化技术呢 ?
池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。在编程领域,比较典型的池化技术有:
线程池、连接池、内存池、对象池等。
主要来介绍一下其中比较简单的线程池的实现原理,希望读者们可以举一反三,通过对线程池的理解,学习并掌握所有编程中池化技术的底层原理。
我们通过创建一个线程对象,并且实现Runnable接口就可以实现一个简单的线程。可以利用上多核CPU。当一个任务结束,当前线程就接收。但很多时候,我们不止会执行一个任务。如果每次都是如此的创建线程->执行任务->销毁线程,会造成很大的性能开销。那能否一个线程创建后,执行完一个任务后,又去执行另一个任务,而不是销毁。这就是线程池。这也就是池化技术的思想,通过预先创建好多个线程,放在池中,这样可以在需要使用线程的时候直接获取,避免多次重复创建、销毁带来的开销。
线程池的优势:
线程池做的工作主要是:控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。
它的主要特点为:线程复用,控制最大并发数,管理线程。
第一:降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。
第三:提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。
上个代码看下
public class AThread {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10 ; i++) {
pool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "号线程--->run");
}
});
}
}
}
输出:
pool-1-thread-1号线程--->run
pool-1-thread-9号线程--->run
pool-1-thread-7号线程--->run
pool-1-thread-8号线程--->run
pool-1-thread-2号线程--->run
pool-1-thread-6号线程--->run
pool-1-thread-5号线程--->run
pool-1-thread-10号线程--->run
pool-1-thread-3号线程--->run
pool-1-thread-4号线程--->run
大家应该看出来了,其实线程池就是提前创建一定数量的线程,当我们使用的时候可以直接取出来,而不需要我们再次的创建了,当我们使用完之后,可以再放回到线程池,方便下次使用的时候直接调用即可,这样节省了我们创建线程的时间,而且也避免了我们频繁创建线程而消耗极大的内存
大家发现了我们输出的问题了,今天先留个空,下次再说
喜欢的小伙伴可以关注微信公众号哦,每天都有干货
还没有评论,来说两句吧...