java.util.concurrent.ThreadPoolExecutor奇怪的逻辑

时间:2010-03-23 15:06:37

标签: java multithreading

查看ThreadPoolExcecutor的这个方法:

public void execute(Runnable command) {
    ...
        if (runState == RUNNING && workQueue.offer(command)) {
            if (runState != RUNNING || poolSize == 0)
                ensureQueuedTaskHandled(command);
        }
    ...
}

检查runState是否为RUNNING,然后是对开。当我试图对SEDA模型做一些调整时,我想了解线程池的内部。
你认为这段代码是否正确?

2 个答案:

答案 0 :(得分:2)

runStatevolatile,所以是的,状态可以在初次检查和调用workQueue.offer后改变

答案 1 :(得分:2)

在将命令添加到队列后,执行程序的runState可能会在初始检查和后续检查之间发生变化。其中一个原因是如果调用执行程序的shutdown()方法。

执行第二次检查,以便如果执行程序已关闭,则会正确处理任何排队的任务,而不是滞留在队列中。