看一下ThreadPoolExcecutor的这种方法:
public void execute(Runnable command) {
...
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
...
}
它检查
runState
是RUNNING
,然后是对面。当我尝试对类似SEDA的模型进行一些调整时,我想了解线程池的内部。您认为此代码正确吗?
最佳答案
将命令添加到队列后,执行者的runState可能会在初始检查和后续检查之间进行更改。原因之一是是否调用了执行者的shutdown()
方法。
执行第二项检查,以便如果执行程序已被关闭,则将适当处理所有排队的任务,而不是被束缚在队列中。