/**
开始清理并且标记一个即将销毁的Worker。只有Worker所在的线程会被调用。除非,completedAbruptly被设置(为true)了,说明当前线程是意外停止了,假设Worker总数已经在退出之前重新调整了的。这个方法把当前Worker线程从WorkerSet中移除,并且如果由于用户Task异常导致退出,或者只有少于corePoolSize
的Worker正在运行,或者队列并不是空的但是没有Worker的情况下,可能终止整个线程池,或者重新替换Worker。
private void processWorkerExit(Worker w, boolean completedAbruptly) {
if (completedAbruptly) // If abrupt, then workerCount wasn't adjusted
decrementWorkerCount();
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
completedTaskCount += w.completedTasks;
workers.remove(w);
} finally {
mainLock.unlock();
}
tryTerminate();
int c = ctl.get();
if (runStateLessThan(c, STOP)) {
if (!completedAbruptly) {
int min = allowCoreThreadTimeOut ? 0 : corePoolSize;
if (min == 0 && ! workQueue.isEmpty())
min = 1;
if (workerCountOf(c) >= min)
return; // replacement not needed
}
addWorker(null, false);
}
}
传入参数: Worker w:要执行退出的Worker对象 boolean completedAbruptly:是否用户异常退出,true为异常退出。
步骤