java 线程池的原理及使用

在java并发编程中线程池是使用非常多的一个并发框架,通过合理的使用线程池可以降低资源的消耗,提高响应的速度以及提高线程的可管理性。

那么线程池的实现原理是什么呢?

我们通过一个新的任务的处理流程来说明线程池的原理,当提交一个新的任务到线程池时,线程池判断corePool中的线程是否都在执行任务,如果不是的话,就创建一个新的线程来执行这个任务,否则,就会判断BlockingQueue是否已满,如果BlockingQueue没有满,就把这个任务存储在里面,如果BlockingQueue已经满了,线程池会判断线程池中的线程是否都处于工作状态,如果没有的话,就会创建一个新的线程来执行任务,否则就会把这个任务交给饱和策略来处理。

如上图所示就是线程池大致的处理流程。

在这里解释下corePoolSize、BlockingQueue、maximumPoolSize是什么意思。

corePoolSize:核心线程池的大小,即核心线程池的线程数量。如果核心线程池中线程数量小于这个值,就创建线程来处理任务。

BlockingQueue:是一个队列,用于存放任务的队列,当核心线程池已满,队列未满,任务就存放到队列中。

maximumPoolSize:线程池的最大线程数量,如果队列已满,但是线程池数量还没有达到这个值,就创建线程来处理。

那么线程池具体的执行步骤是怎么样的呢?

线程池的execute()方法执行任务的结果有四种情况:

扫描二维码关注公众号,回复: 11850214 查看本文章

1.如果当前运行的线程数量小于corePoolSize,则创建一个新的线程来执行任务。

2.如果运行的线程数量大于corePoolSize,则把这个任务加入到BlockingQueue中。

3.如果BlockingQueue已满,则任务无法加入到队列中,那么就创建新的线程来执行这个任务。

4.如果当前运行的线程数量已经等于maximumPoolSize,线程池就会通过策略拒绝这个任务。

线程池的执行示意图如下:


了解了线程池的执行过程及原理,再看下线程池的使用吧,主要是线程池几个参数的设置。

ThreadPoolExecutor threadPoolExecutor = new 
				ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);

我们可以看到可以设置的参数有corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler这几个,corePoolSize和maximumPoolSize已经解释过了,我们就来解释下另外几个参数都是什么意思。

keepAliveTime:线程的存活时间,当线程没有任务执行时,保持存活的时间,当一个线程空闲的时间超过这个值,就会销毁这个线程。

unit:是keepAliveTime的时间单位,可选的单位有天,小时,秒等。

workQueue:它决定了缓存任务的排队策略,对于不同的场景使用不同的阻塞队列,常用的阻塞队列有2种,SynchronousQueue和LinkedBlockingQueue。

threadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置一个有意义的名字。

handler:线程池的处理策略,当线程池的线程达到maximumPoolSize后,线程池就不会再创建线程来处理任务,就需要通过线程池的处理策略来处理该任务。

线程池就到这里了,感觉有用的小伙伴点个赞呀。

猜你喜欢

转载自blog.csdn.net/wzs535131/article/details/103813081