ThreadPoolExecutor $ Worker中的奇怪代码

时间:2011-07-18 13:20:54

标签: java multithreading

我在ThreadPoolExecutor $ Worker.runTask中找到了这样奇怪的代码

if (runState < STOP && Thread.interrupted() && runState >= STOP)
                thread.interrupt();

为什么需要检查runState < STOPrunState >= STOP。 有一条评论以某种方式解释了为什么这种双重检查是必要的,但我不明白。

因此要计算表达式的最终值,它将从内存runState中获取,然后调用Thread.interrupted()然后再从内存中获取runState(第一个runState可能与第二个不同?)并将这三个表达式的值与?

1 个答案:

答案 0 :(得分:2)

代码的初始目的是清除线程的interrupted状态,除非它是shuttingDownNow,所以它必须只是

if (runState < STOP)
      Thread.interrupted();

但我们有并发性。考虑两个运行代码的线程Worker

if (runState < STOP &&
      Thread.interrupted() &&
      runState >= STOP)
    thread.interrupt();

和执行shutdownNow的线程:

if (state < STOP)
    runState = STOP;
for (Worker w : workers) {
    w.interruptNow();
}

现在这是双重检查的情况

Worker:        if (runState < STOP &&    // true for now

shutdownNow:   if (state < STOP)
shutdownNow:       runState = STOP;      // set new state
shutdownNow:   for (Worker w : workers) {
shutdownNow:       w.interruptNow();     // interrupt      
shutdownNow:   }

Worker:              Thread.interrupted() &&   // clears interrupted state 
Worker:              runState >= STOP)         // but we have double check
Worker:            thread.interrupt();         // that will setup it again