if (!t.isInterrupted() && w.tryLock()) {
try {
t.interrupt();
} catch (SecurityException ignore) {
} finally {
w.unlock();
}
}
if (onlyOne)
break;
}
} finally {
mainLock.unlock();
}
}
2、为什么要调用tryTerminate()?
tryTerminate()
不会强行终止线程池,当workerCount
为0,workerQueue
为空时:
-
状态流转到
TIDYING
。 -
然后调用钩子函数
terminated()
。 -
状态从
TIDYING
流转到TERMINATED
。 -
调用
termination.sinaglAll()
,通知前面阻塞在awaitTermination
的所有调用者线程。
final void tryTerminate() {
for (;😉 {
int c = ctl.get();
if (isRunning© ||
runStateAtLeast(c, TIDYING) ||
(runStateOf© == SHUTDOWN && ! workQueue.isEmpty()))
return;
if (workerCountOf© != 0) { // Eligible to terminate
interruptIdleWorkers(ONLY_ONE);
return;
}
//1.当workQueue为空,workerCount为空时,cas流转状态为TIDYING
//2.并调用了一个空钩子函数terminated
//3.最终将状态流转为TERMINATED,并通知awaitTermination