ctl成员变量
/**
* ctl 存储了两部分信息
* workerCount : 线程数
* runStatus: 线程池的状态
*
* ctl 是一个 AtomicInteger,int 总共 32位(bit),左边3位用于记录线程池运行状态,
* 后面29位用于记录线程数
*
* workerCount 记录允许开始,还不允许结束的 worker数量。workerCount 可能在某个瞬间
* 与实际存活线程数不一致。比如线程工厂(ThreadFactory)创建线程失败了,或者线程已经开始
* 退出,但还没减少计数。对用户可见的线程数,是通过 workers set 的大小。
*
* runState 提供线程池的生命周期控制,主要有以下值,或者说线程池有以下状态
* RUNNING: 接收新的任务、处理队列中的任务
* SHUTDOWN: 不接收新的任务,但是处理队列中的任务
* STOP:不接受新的任务,不执行队列中的任务,中断处理中的任务
* TIDYING: 所有任务都执行完成,workerCount=0,线程转换到TIDYING的过程将
* 执行钩子方法terminated()
* TERMINATED: terminated() 方法执行完成后,进入TERMINATED 状态
*
* 为了可以实现状态的比较,这些状态值是随着时间单调递增的。状态流转如下:
* RUNNING -> SHUTDOWN
* 调用shutdonw()方法时触发
* (RUNNING or SHUTDOWN) -> STOP
* 调用showdownNow()方法时触发
* SHUTDOWN -> TIDYING
* 当队列和线程池都空以后
* STOP -> TIDYING
* 当线程池为空以后
* TIDYING -> TERMINATED
* 当 terminated() 钩子方法执行完成后
*
* awaitTermination() 方法将阻塞住直到线程池到达TERMINATED 状态
*
*
*/
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;
private static int runStateOf(int c) { return c & ~CAPACITY; }
private static int workerCountOf(int c) { return c & CAPACITY; }
private static int ctlOf(int rs, int wc) { return rs | wc; }