final void tryTerminate() {
for (;;) {
int c = ctl.get();
//正在运行
if (isRunning(c) ||
//tidying terminated
runStateAtLeast(c, TIDYING) ||
//shutdown 且 队列不为空
(runStateOf(c) == SHUTDOWN && ! workQueue.isEmpty()))
//综合上面3个条件,可以推断出当线程池stop或者shutdown且任务队列为空,就可以去terminated了
return;
//worker的数量不为零,说明还有任务在执行,所以先不要terminated线程池
if (workerCountOf(c) != 0) { // Eligible to terminate
//为什么这里要去中断一个线程?
interruptIdleWorkers(ONLY_ONE);
return;
}
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
//把ctl设置为TIDYING
if (ctl.compareAndSet(c, ctlOf(TIDYING, 0))) {
try {
terminated();
} finally {
ctl.set(ctlOf(TERMINATED, 0));
termination.signalAll();
}
return;
}
} finally {
mainLock.unlock();
}
// else retry on failed CAS
}
}
网友评论