流程图
下面我们再来看看这些状态之间是怎么流转的:
(1)新建线程池时,它的初始状态为RUNNING,这个在上面定义ctl的时候可以看到;
(2)RUNNING->SHUTDOWN,执行shutdown()方法时;
(3)RUNNING->STOP,执行shutdownNow()方法时;
(4)SHUTDOWN->STOP,执行shutdownNow()方法时【本文由公从号“彤哥读源码”原创】;
(5)STOP->TIDYING,执行了shutdown()或者shutdownNow()后,所有任务已中止,且工作线程数量为0时,此时会执行terminated()方法;
(6)TIDYING->TERMINATED,执行完terminated()方法后;
源码分析
你以为贴个状态的源码,画个图就结束了嘛?那肯定不能啊,下面让我们一起来看看源码中是怎么控制的。
(1)RUNNING
RUNNING,比较简单,创建线程池的时候就会初始化ctl,而ctl初始化为RUNNING状态,所以线程池的初始状态就为RUNNING状态。
// 初始状态为RUNNING
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
(2)SHUTDOWN
执行shutdown()方法时把状态修改为SHUTDOWN,这里肯定会成功,因为advanceRunState()方法中是个自旋,不成功不会退出。
public void shutdown() {
final ReentrantLock mainLock = this.mainLock;
mainLock.