2011-07-18 17 views
3

私はなぜそれがrunState < STOPrunState >= STOPをチェックする必要がない奇妙なコード

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

ThreadPoolExecutor $ Worker.runTaskに、このような奇妙なコードを発見しました。 何らかの理由でこのような二重チェックが必要な理由を説明するコメントがありますが、わかりません。

したがって、式の最終的な値を計算するには、メモリrunStateから取得し、次にThread.interrupted()を呼び出してから、メモリrunState(最初のrunStateは2番目のものと異なる場合があります)を取り、そして?それはshuttingDownNowでない限り、それだけで

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

しなければならなかった。しかし、我々は、並行性を持っているように、コードの

答えて

2

当初の目的は、スレッドのinterrupted状態をクリアすることです。

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

shutdownNowを実行しているスレッド:コードを実行する2つのスレッド、Worker考えてみましょう今ここに

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 
の場合であります