2010-03-23 60 views
1

看ATH ThreadPoolExcecutor的这种方法:java.util.concurrent.ThreadPoolExecutor中的奇怪的逻辑

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

它检查runStateRUNNING,然后oposite。正如我试图对SEDA模型进行一些调整,我想了解线程池的内部。
你认为这段代码是正确的吗?

回答

2

执行程序的runState可以在初始校验和的命令后的后续检查之间潜在地改变呼叫之后改变被添加到队列 。其中一个原因是如果执行者的shutdown()方法被调用。

执行第二次检查,以便如果执行程序已关闭,则任何排队的任务都会得到适当处理,而不是被搁置在队列中。

2

runStatevolatile,所以是它的状态可初始检查并workQueue.offer