1. 主要实现类:ThreadPoolExecutor

  2. 参数说明:

corePoolSize:核心线程数,线程池保有的线程的数量,即Worker的数量,如果allowCoreThreadTimeOut 参数不设置,即使这些线程空闲也不会被回收。也就是说如果allowCoreThreadTimeOut 参数不设置那么当线程池内的线程的数量升至大于等于corePoolSize后,线程池至少会保有corePoolSize数量的线程。

workQueue:线程池工作队列,当线程池内线程的数量达到corePoolSize并且这些线程都处于忙碌状态时,那么后续提交至线程池的任务会被缓存至工作队列中,当线程池内有空闲线程时就会从此工作队列中取任务并执行。

maximumPoolSize:线程池所允许的最大线程的数量,当工作队列满时,线程池会继续创建新的线程,但是线程池内总线程数量不会超过maximumPoolSize。

keepAliveTime:当线程池内线程的数量超过corePoolSize时,超出部分线程的空闲等待时间,当空闲时间超过此值则超出部分线程就会被回收。

unit:keepAliveTime的单位。

threadFactory:用于创建线程。

handler:线程池任务拒绝策略接口,当工作队列满并且线程池忙碌线程数量达到maximumPoolSize后,后续提交至线程池的任务会被拒绝,此时回调此接口,自己实现具体的拒绝策略。如果此接口没有指定则报java.util.concurrent.RejectedExecutionException异常。

  1. 线程池状态:

其中AtomicInteger变量ctl的功能非常强大:利用低29位表示线程池中线程数,通过高3位表示线程池的运行状态:
1、RUNNING:-1 << COUNT_BITS,即高3位为111,该状态的线程池会接收新任务,并处理阻塞队列中的任务;
2、SHUTDOWN: 0 << COUNT_BITS,即高3位为000,该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;
3、STOP : 1 << COUNT_BITS,即高3位为001,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;
4、TIDYING : 2 << COUNT_BITS,即高3位为010,该状态表示线程池对线程进行整理优化;
5、TERMINATED: 3 << COUNT_BITS,即高3位为011,该状态表示线程池停止工作;

  1. 实现原理

线程池会维护一个线程(Worker)集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(Runnable)时,如果线程池Worker数量小于corePoolSize,线程池会new一个Worker并放入workerSet集合中,反之线程池会将任务放入workQueue中。如果workQueue满了则会继续new Worker,直到Worker数量达到maximumPoolSize。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,就会阻塞worker,直到队列中有任务了就取出来继续执行。详见:https://blog.csdn.net/u013332124/article/details/79587436

线程销毁:核心线程设置了允许超时或者对于超出corePoolSize的线程,在Worker循环从阻塞队列中获取任务时会设置一个等待时间,当超过这个时间,阻塞队列返回null,Worker循环结束,此Worker被从workerSet中移除。

image