我明白,当我们添加新任务时,我们需要重新检查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);
}
最佳答案
这是一个例子,
假设corePoolSize = 1。第一次检查时,只有一个worker。
之间if (workerCountOf(c) < corePoolSize)
和workQueue.offer(command)
,唯一的worker完成了它的工作,并且在 block 队列中找不到工作,因此它存在。复查时,workerCountOf(recheck) == 0
发生。我们需要启动一个新的工作人员。
CorePoolSize并不总是等于实际的worker数量。每个 worker 都可能在完成工作后死亡,并且在有限的时间内在阻塞队列中找不到工作。
关于JAVA-ThreadPoolExecutor 为什么在recheck过程中需要在execute函数中判断worker个数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46901095/