Java的Interrupt與線程中斷

中斷狀態

每個線程都有一個boolean屬性,表示中斷狀態,初始值爲false。html

中斷線程:Thread.interrupt()

正常狀況下,只是將線程的中斷狀態變爲true。線程中能夠經過輪詢中斷狀態,作出相應的處理。
若是線程在阻塞狀態下,線程將退出阻塞且中斷狀態將被清除(即爲false),且會拋出InterruptException。
(IO操做忽略)多線程

查詢中斷狀態

(1)isInterrupted(),返回當前的中斷狀態,不會改變中斷狀態。
(2)static interrupted(),返回當前中斷狀態,且會清除中斷狀態。(即第二次調用將返回 false)線程

處理InterruptedException

(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繼承

相關文章
相關標籤/搜索