Java中斷機制

###中斷的原理 Java中斷機制是一種協做機制,中斷並不能直接終止另外一個線程,而須要被中斷的線程本身處理中斷。java

java.lang.Thread類提供了幾個方法來操做這個中斷狀態,這些方法包括:

    public static boolean interrupted()

    測試當前線程是否已經中斷。線程的中斷狀態由該方法清除。

    public boolean isInterrupted()

    測試線程是否已經中斷。線程的中斷狀態不受該方法的影響。

    public void interrupt()

    中斷線程


線程1經過調用interrupt方法將線程2的中斷狀態置爲true,2能夠在合適的時候調用interrupted或isInterrupted來檢測狀態並作相應的處理。


類庫中的有些類的方法也可能會調用中斷:

    如FutureTask中的cancel方法,若是傳入的參數爲true,它將會在正在運行異步任務的線程上調用interrupt方法,
    若是正在執行的異步任務中的代碼沒有對中斷作出響應,那麼cancel方法中的參數將不會起到什麼效果;

    又如ThreadPoolExecutor中的shutdownNow方法會遍歷線程池中的工做線程並調用線程的interrupt方法來中斷線程,
    因此若是工做線程中正在執行的任務沒有對中斷作出響應,任務將一直執行直到正常結束。


thread.stop():
    線程會立刻中止,可是可能致使數據不一樣步,或者資源得不到回收的問題並且stop已經標註爲做廢方法,因此使用必定要慎重。

###中斷的處理異步

interrupt()方法僅僅是在當前線程中打了一箇中止的標識將中斷標誌修改成true,並無真正的中止線程:
    若是在此基礎上進入堵塞狀態(sleep(),wait(),join()),立刻就會拋出一個InterruptedException,
    且中斷標誌被清除,從新設置爲false,線程退出。


若是遇到的是可中斷的阻塞方法拋出InterruptedException:

    能夠繼續向上層拋出該異常。

    如有時候不太方便在方法上拋出InterruptedException,好比要實現的某個接口中的方法簽名上沒有throws InterruptedException,
    這時就能夠捕獲可中斷方法的InterruptedException而且恢復異常(從新設置中斷)。


中斷的響應:

    有些程序可能一檢測到中斷就立馬將線程終止,有些多是退出當前執行的任務,繼續執行下一個任務……
    做爲一種協做機制,這要與中斷方協商好,當調用interrupt會發生些什麼都是事先知道的,如作一些事務回滾操做,一些清理工做,一些補償操做等。
    若不肯定調用某個線程的interrupt後該線程會作出什麼樣的響應,那就不該當中斷該線程。

###中斷的使用測試

  1. 點擊某個桌面應用中的取消按鈕時;
  2. 某個操做超過了必定的執行時間限制須要停止時;
  3. 多個線程作相同的事情,只要一個線程成功其它線程均可以取消時;
  4. 一組線程中的一個或多個出現錯誤致使整組都沒法繼續時;
  5. 當一個應用或服務須要中止時。
相關文章
相關標籤/搜索