ctl的含义
- 线程池本身的状态(前3位)
- 线程池中所运行着的线程的数量(后29位) ```java // c 为旧值, ctlOf 返回结果为新值 ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))));
// rs 为高 3 位代表线程池状态, wc 为低 29 位代表线程个数,ctl 是合并它们
private static int ctlOf(int rs, int wc) { return rs | wc; }
```
:::tips
这两个信息存储在一个原子变量 ctl 中,目的是将线程池状态与线程个数合二为一,这样就可以用**一次 cas** 原子操作
进行赋值
:::
线程池的状态
- RUNNING:线程池可以接收新的任务提交,并且还可以正常处理阻塞队列中的任务。
2. SHUTDOWN:不再接收新的任务提交,不过线程池可以继续处理阻塞队列中的任务。
3. STOP:不再接收新的任务,同时还会丢弃阻塞队列中的既有任务;此外,它还会中断正在处理中的任务。
4. TIDYING:所有的任务都执行完 毕后(同时也涵盖了阻塞队列中的任务),当前线程池中的活动的线程数量降为0,将会调用terminated方法。
5. TERMINATED:线程池的终止状态, 当terminated方法执行完毕后,线程池将会处于该状态之下。
RUNNING -> SHUTDOWN:当调用了线程池的shutdown方法时,或者当finalize方法被隐式调用后(该方法内部会调用shutdown方法)
RUNNING, SHUTDOWN -> STOP:当调用了线程池的shutdownNow方法时
SHUTDOWN -> TIDYING:在线程池与阻塞队列均变为空时
STOP -> TIDYING:在线程池变为空时
TIDYING -> TERMINATED:在terminated方法被执行完毕时


