每個線程都有一個boolean屬性,表示中斷狀態,初始值爲false。html
正常狀況下,只是將線程的中斷狀態變爲true
。線程中能夠經過輪詢中斷狀態,作出相應的處理。
若是線程在阻塞狀態下,線程將退出阻塞且中斷狀態將被清除
(即爲false),且會拋出InterruptException。
(IO操做忽略)多線程
(1)isInterrupted(),返回當前的中斷狀態,不會改變中斷狀態。
(2)static interrupted(),返回當前中斷狀態,且會清除中斷狀態。(即第二次調用將返回 false)線程
(1)繼續拋出。
若是拋出InterruptedException意味着是一個阻塞方法,那麼調用一個阻塞方法則意味着調用者也是一個阻塞方法,應該有某種策略來處理InterruptedException。
(2)捕獲InterruptedException,執行清理
,再從新拋出InterruptedException。
(3)再次調用interrupt()。
當由Runnable定義的任務調用一個可中斷的方法時,在這種狀況下,不能從新拋出InterruptedException,由於Runnable接口的run方法不容許拋出異常。
當一個阻塞方法檢測到中斷並拋出InterruptedException可是不能從新拋出它,那麼應該保留中斷髮生的證據,以便調用棧中更高層的代碼能知道中斷,並對中斷作出響應
,該任務能夠經過調用interrupt()以從新中斷當前線程來完成。code
public void run() { try { while (true) { Task task = queue.take(10, TimeUnit.SECONDS); task.execute(); } } catch (InterruptedException e) { // Restore the interrupted status Thread.currentThread().interrupt(); } }
如一個IO類會阻塞線程,但不支持中斷。則能夠寫一個新IO類,繼承Thread類,重寫interrupt方法,在interrupt中關閉IO,最後調用super.interrupt();htm
在進入阻塞前被中斷,被稱爲待決中斷。
在調用阻塞方法時,會馬上拋出InterruptException。blog
參考文章:多線程-interrupt(),isInterrupted(),interrupted() - 小路不懂2繼承