2011-07-18 105 views
3

我在的ThreadPoolExecutor $ Worker.runTask奇怪的代碼

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

發現這樣奇怪的代碼,爲什麼它需要檢查runState < STOPrunState >= STOP。 有一個評論,在某種程度上解釋爲什麼這樣的雙重檢查是必要的,但我不明白這一點。

因此,要計算表達式的最終值,它將從內存中運行runState,然後調用Thread.interrupted(),然後再從內存runState中取出(第一個runState可能與第二個不同),並將這三個表達式的值與和?

回答

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 
的情況下