线程池ctl
线程池ctl源码
打开ThreadPoolExecutor的源码(我裁剪掉了一部分),一开始就会发现:
public class ThreadPoolExecutor extends AbstractExecutorService {
/** 我以一个字节8位来简化解释线程池对运行状态和当前有效线程个数的原子管理方案
* 线程池当中,用一个ctl原子变量包装了高3位的运行状态和低5位的线程个数
*
* 运行状态: 线程池初始化后,就处于该状态:此时,线程池可以接受新任务并且处理任务
* 关闭状态: 调用shutdown()方法时,就处于该状态:此时,shutdown()方法之后不能再提交新任务,线程池会把shutdown()方法之前提交的任务按照线程池工作原理的步骤都处理完毕。(请参考我的博客:线程池工作原理)
* 停止状态: 调用shutdownNow()方法时,就处于该状态:此时,shutdownNow()方法之后不能再提交新任务,线程池不处理已经提交到任务队列中的任务,线程池尝试中断正在执行的工作线程
* 整理状态: 线程池内部自己使用的状态:当线程池queue任务队列为空,hashset<worker>为空时,就是该状态,该状态是由关闭状态/停止状态转变而来的。当处于整理状态时,线程池会调用terminated()钩子方法
* 终结状态: 当钩子方法terminated()执行完毕之后,线程池由整理状态转变为终结状态。钩子方法是线程池自动调用的。
*
* 在线程池终结状态之前,可以调用awaitTermination()阻塞方法,使当前主线程阻塞,直至线程状态转变为终结状态
*/
/**
* The main pool control state, ctl, is an atomic integer packing
* two conceptual fields
* workerCount, indicating the effective number of threads
* runState, indicating whether running, shutting down etc
*
* The runState provides the main lifecycle control, taking on values:
*
* RUNNING: Accept new tasks and process queued tasks
* SHUTDOWN: Don't accept new tasks, but process queued tasks
* STOP: Don't accept new tasks, don't process queued tasks, and interrupt in-progress tasks
* TIDYING: All tasks have terminated, workers is zero,the thread transitioning to state TIDYING
* TERMINATED: t