代码之家  ›  专栏  ›  技术社区  ›  rodrigoap

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

  •  1
  • rodrigoap  · 技术社区  · 16 年前

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

    它检查一下 runState 是 RUNNING
    你认为这个代码正确吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Adamski    16 年前

    执行器的运行状态可能会在初始检查和后续检查之间发生变化 将命令添加到队列后 shutdown() 方法被调用。

    执行第二个检查,以便如果执行器已关闭,则任何排队的任务都会得到适当的处理,而不是滞留在队列中。

        2
  •  2
  •   Alexander Pogrebnyak    16 年前

    runState volatile ,所以在初始检查和调用 workQueue.offer