看一下ThreadPoolExcecutor的这种方法:

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

它检查runStateRUNNING,然后是对面。当我尝试对类似SEDA的模型进行一些调整时,我想了解线程池的内部。
您认为此代码正确吗?

最佳答案

将命令添加到队列后,执行者的runState可能会在初始检查和后续检查之间进行更改。原因之一是是否调用了执行者的shutdown()方法。

执行第二项检查,以便如果执行程序已被关闭,则将适当处理所有排队的任务,而不是被束缚在队列中。

10-05 18:25