2013-04-05 46 views
3

好吧,讓我們說我有一個執行while()循環的線程。在循環期間,可以做一些事情,然後回去睡覺:「乾淨」的方式來中斷一個可能做某事的線程

public void run() { 
    while (some_condition) { 
     doSomeLongJob();  // this could be a long job 
     try { 
      Thread.sleep(a_bit); // back to sleep 
     } catch (InterruptedException ie) { 
      handleInterruptionButDoNotExitLoop(); 
     } 
    } 
} 

一些問題:

  1. 如果doSomeLongJob的執行過程中的一些中斷到來時,該方法將繼續其自然結束? (我想是的,只要沒有人檢查Thread.interrupted()但我想確認);
  2. 捕捉中斷後,將中斷()狀態重置爲false?
  3. 總之,只要線程狀態被重置,線程可以被中斷n時間?有沒有辦法重置手動線程狀態以處理在執行doSomeLongJob期間的中斷?

回答

1

回答您的問題:

  1. 當你說中斷你的意思InterruptedException的?如果是這樣,我認爲你應該在doSomeLongJob裏面嘗試處理可能的異常。

  2. 它不會被重置爲false,您必須手動完成。

  3. 要重置中斷狀態,請調用Thread.interrupted()。

+0

是的,我的意思是當InterruptedException發生時...但是讓我們說,例如,我將doSomeLongJob移動到try/catch塊中。如果發生InterruptedException,執行什麼? (即有人調用Thread.interrupt())。有沒有一種方法可以回滾doSomeLongJob中已完成的工作? – Ema 2013-04-05 11:38:45

+0

引發InterruptedException的方法應將中斷標誌重置爲false。 Thread.sleep()會做到這一點。 – 2013-04-05 20:44:27

+0

@Ema鑑於該方法處於執行過程中,我想說你必須自己做回滾,但如果中斷源自方法外部,這將會非常棘手。 – 2013-04-08 11:15:44

1

通過調用Thread.interrupted()您將得到該標誌的狀態,然後清除它。

我的建議是:如果有疑問,請將此方法稱爲明確(對於必須維護代碼的人員)您希望吸收該情況並繼續進行。

1
  1. 也許,如果doSomeLongJob具有開放InterruptibleChannel IO對象,他們將拋出一個ClosedByInterruptException下一次你會嘗試訪問他們,如果線程中斷狀態尚未消失。

  2. InterruptedException由Java核心類拋出,線程中斷狀態不是設置

  3. Thread.interrupted將清除中斷狀態。如果你只需要一箇中斷測試,Thread.isInterrupted會給你狀態並保持中斷狀態。

相關問題