我知道在添加新任务时我们需要重新检查TPE是否正在运行,但我的问题是为什么我们需要判断workerCountOf(recheck)是否等于0?我的理解是,如果TPE在重新检查期间运行,则任务将保证由TPE执行。所以我认为TPE有责任检查是否还有任何线程来执行任务,而不是提交者!
所以我是对的吗?
代码如下:
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
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);
}
答案 0 :(得分:1)
这是一个例子,
假设corePoolSize = 1.第一次检查时,只有一个工人。
在if (workerCountOf(c) < corePoolSize)
和workQueue.offer(command)
之间,唯一的工作人员完成了它的工作并且在块队列中找不到任何工作,因此它存在。重新检查时,workerCountOf(recheck) == 0
发生了。我们需要开始一个新工人。
CorePoolSize并不总是等于工人的实际数量。每项工作在完成工作后都会死亡,并且在有限的时间内没有在区块队列中找到工作。
答案 1 :(得分:0)
但是,即使队列中没有任务,核心线程也永远不会在完成工作后退出