看看 ThreadPoolExcecutor 的这个方法:
public void execute(Runnable command) {
...
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
...
}
它检查 runState
是否为 RUNNING
然后相反。当我尝试对类似 SEDA 的模型进行一些调整时,我想了解线程池的内部结构。
你认为这段代码正确吗?
最佳答案
执行器的运行状态可能会在初始检查和后续检查之间发生变化在命令添加到队列后。原因之一是调用了执行程序的 shutdown()
方法。
执行第二次检查,以便如果执行程序已关闭,则任何排队的任务都会得到适当处理,而不是被困在队列中。
关于java.util.concurrent.ThreadPoolExecutor 奇怪的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500966/