###中斷的原理 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後該線程會作出什麼樣的響應,那就不該當中斷該線程。
###中斷的使用測試
- 點擊某個桌面應用中的取消按鈕時;
- 某個操做超過了必定的執行時間限制須要停止時;
- 多個線程作相同的事情,只要一個線程成功其它線程均可以取消時;
- 一組線程中的一個或多個出現錯誤致使整組都沒法繼續時;
- 當一個應用或服務須要中止時。