查看ThreadPoolExcecutor的这个方法:
public void execute(Runnable command) {
...
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
...
}
检查runState
是否为RUNNING
,然后是对开。当我试图对SEDA模型做一些调整时,我想了解线程池的内部。
你认为这段代码是否正确?
答案 0 :(得分:2)
runState
是volatile
,所以是的,状态可以在初次检查和调用workQueue.offer
后改变
答案 1 :(得分:2)
在将命令添加到队列后,执行程序的runState可能会在初始检查和后续检查之间发生变化。其中一个原因是如果调用执行程序的shutdown()
方法。
执行第二次检查,以便如果执行程序已关闭,则会正确处理任何排队的任务,而不是滞留在队列中。