摘要:中斷狀態每一個線程都有一個屬性,表示中斷狀態,初始值為。中斷線程正常情況下,只是將線程的中斷狀態變為。線程中可以通過輪詢中斷狀態,做出相應的處理。中斷一個不支持中斷的類如一個類會阻塞線程,但不支持中斷。
中斷狀態
每一個線程都有一個boolean屬性,表示中斷狀態,初始值為false。
中斷線程:Thread.interrupt()正常情況下,只是將線程的中斷狀態變為true。線程中可以通過輪詢中斷狀態,做出相應的處理。
如果線程在阻塞狀態下,線程將退出阻塞且中斷狀態將被清除(即為false),且會拋出InterruptException。
(IO操作忽略)
(1)isInterrupted(),返回當前的中斷狀態,不會改變中斷狀態。
(2)static interrupted(),返回當前中斷狀態,且會清除中斷狀態。(即第二次調用將返回 false)
(1)繼續拋出。
如果拋出InterruptedException意味著是一個阻塞方法,那么調用一個阻塞方法則意味著調用者也是一個阻塞方法,應該有某種策略來處理InterruptedException。
(2)捕獲InterruptedException,執行清理,再重新拋出InterruptedException。
(3)再次調用interrupt()。
當由Runnable定義的任務調用一個可中斷的方法時,在這種情況下,不能重新拋出InterruptedException,因為Runnable接口的run方法不允許拋出異常。
當一個阻塞方法檢測到中斷并拋出InterruptedException但是不能重新拋出它,那么應該保留中斷發生的證據,以便調用棧中更高層的代碼能知道中斷,并對中斷做出響應,該任務可以通過調用interrupt()以重新中斷當前線程來完成。
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();
待決中斷在進入阻塞前被中斷,被稱為待決中斷。
在調用阻塞方法時,會立刻拋出InterruptException。
參考文章:多線程-interrupt(),isInterrupted(),interrupted() - 小路不懂2
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73306.html
摘要:現在終止一個線程,基本上只能靠曲線救國式的中斷來實現。中斷機制的核心在于中斷狀態和異常中斷狀態設置一個中斷狀態清除一個中斷狀態方法同時會返回線程原來的中斷的狀態。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...
摘要:線程中斷線程中斷就是一種協作機制。它并不會真正的中斷一個正在運行的線程,而只是發出中斷請求,然后由線程在下一個合適的時刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務并處理隊列中的任務 SHUTDOWN:不接收新的任務,但是處理隊列中的任務 STOP:不接收新的任務,不處理隊列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的線程數是0 TER...
摘要:沒有提供一種安全直接的方法來停止某個線程,但是提供了中斷機制。中斷的原理中斷機制是一種協作機制,也就是說通過中斷并不能直接終止另一個線程,而需要被中斷的線程自己處理中斷。線程的中斷狀態由該方法清除。測試線程是否已經中斷。 1. 引言 當我們點擊某個殺毒軟件的取消按鈕來停止查殺病毒時,當我們在控制臺敲入quit命令以結束某個后臺服務時……都需要通過一個線程去取消另一個線程正在執行的任務...
摘要:很多開發人員包括我,尤其是剛進入軟件行業的新手,認為設置線程中斷就是表示線程停止了,不往前執行了,其實不是這樣的,線程中斷只是一個狀態而已,表示已中斷,表示未中斷獲取線程中斷狀態,如果中斷了返回否則返回設置線程中斷不影響線程的繼續執行,但是 ? ? 很多Java開發人員(包括我),尤其是剛進入軟件行業的新手,認為Java設置線程中斷就是表示線程停止了,不往前執行了, Thread.cu...
摘要:最后我們重點關注與一下實際就是調用平臺創建線程的方法來創建線程。線程的中斷標識判斷了解了方法的作用以后,再回過頭來看中這段代碼,就很好理解了。 文章簡介 這一篇主要圍繞線程狀態控制相關的操作分析線程的原理,比如線程的中斷、線程的通信等,內容比較多,可能會分兩篇文章 內容導航 線程的啟動的實現原理 線程停止的實現原理分析 為什么中斷線程會拋出InterruptedException ...
閱讀 787·2021-11-11 16:54
閱讀 1517·2021-08-24 10:01
閱讀 1911·2019-08-30 15:54
閱讀 3296·2019-08-29 14:02
閱讀 3130·2019-08-28 18:22
閱讀 2245·2019-08-28 18:09
閱讀 3698·2019-08-26 10:26
閱讀 2665·2019-08-23 18:23