在查看Java线程池实现的源码时,对于线程池内部worker生命周期有一个不解的地方:当worker所持有的task,或者线程队列中的task都被执行完以后,为什么worker要被移除线程池的worker集合。
追踪源码的过程大致是:
查看execute(Runnable command)方法,发现了addWorker(command, true)的调用
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
进入addWorker(Runnable firstTask, boolean core),发现了worker线程的启动
if (workerAdded) {
t.start();
workerStarted = true;
}
Worker类的run方法即调用ThreadPoolExecutor中的runWorker方法。
在runWorker方法的最后调用了processWorkerExit方法。
} finally {
processWorkerExit(w, completedAbruptly);
}
在processWorkerExit中发现:
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
completedTaskCount += w.completedTasks;
workers.remove(w);
} finally {
mainLock.unlock();
}
worker被从线程集合workers移除了。
所以疑惑或者问题是:
线程持中其实是不保有一定数量可用线程,如果当task队列里面没有要处理的任务,原先创造的worker工作线程都会逐步被移除,直到下次再有新的task到来,才又会创建新的worker工作线程??