摘要:合理中斷線程合理中斷在類中提供了和方法這三個方法分別是用來結束暫?;謴途€程但是都已經被標記為廢棄了因為一個線程不應該由其他線程來結束他應該收到別人的通知然后自己在合適的位置結束如果不合理的結束會導致很多意外的結果比如臨界區還沒完全操作完提前
合理中斷線程 合理中斷
在Thread類中,提供了stop(),suspend()和resume()方法,這三個方法分別是用來結束,暫停,恢復線程. 但是都已經被標記為@Deprecated廢棄了. 因為一個線程不應該由其他線程來結束,他應該收到別人的通知,然后自己在合適的位置結束,如果不合理的結束,會導致很多意外的結果,比如臨界區還沒完全操作完,提前釋放鎖,但是部分狀態已經改變,還有沒有做一些清理操作等等.
基于上面的理由,Java提供了新的中斷機制(interrupt),其他線程調用想要終止線程的interrupt()方法. 這個時候線程會根據自己的狀態做出響應:
如果線程處于阻塞狀態(sleep,wait,join),則線程會拋出InterruptedException異常.
如果線程處于正常運行狀態,則還是正常運行,但是中斷的標志被設置為true,相當于有人通知 你該結束自己了.
被調用線程處于阻塞狀態public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { try { // 被調線程阻塞自己30s sleep(30000); } catch (InterruptedException e) { e.printStackTrace(); } } }; try { // 啟動線程 thread.start(); // 主線程阻塞自己3秒 TimeUnit.SECONDS.sleep(3); // 中斷線程 thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // java.lang.InterruptedException: sleep interrupted // ...被調用線程處于正常運行
被調用線程不處于阻塞的時候,需要調用方法來監控標志.
public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { while (!Thread.interrupted()) { System.out.println("我還穩得住..."); } } }; try { thread.start(); TimeUnit.SECONDS.sleep(3); thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // 我能穩得住 // ...
該程序會在檢測interrupt標志,如果發現interrupt標志設置為true,則會結束自己.
interrupted()和isInterrupt()的區別區別: 是否會清除interrupt標志. isInterrupt()方法不會改變標志,而interrupted()方法會在檢測的同時,如果發現標志為true,則會返回true,然后把標志置為false.
public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { while (!Thread.interrupted()) { System.out.println("我還穩得住..."); } // ????添加下面代碼???? System.out.println(Thread.interrupted()); } }; try { thread.start(); TimeUnit.SECONDS.sleep(3); thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // 我還穩得住... // ...(省略) // false
上面實例說明Thread.interrupted()方法會在標志為true的情況下修改interrupted的標志.
public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { // ????修改方法???? while (!isInterrupted()) { System.out.println("我還穩得住..."); } System.out.println(Thread.interrupted()); } }; try { thread.start(); TimeUnit.SECONDS.sleep(3); thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // 我還穩得住... // ...(省略) // true源碼解析
通過觀察源碼可以看出interrupted方法最后會調用isInterrupted(true)方法,而傳入的參數代表是否清除標志位. 可以看到isInterrupted(boolean)是一個本地方法,最終會通過C/C++來執行. 而isInterrupted()最后傳入的參數為false,說明不清除標志位.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77706.html
摘要:最后我們重點關注與一下實際就是調用平臺創建線程的方法來創建線程。線程的中斷標識判斷了解了方法的作用以后,再回過頭來看中這段代碼,就很好理解了。 文章簡介 這一篇主要圍繞線程狀態控制相關的操作分析線程的原理,比如線程的中斷、線程的通信等,內容比較多,可能會分兩篇文章 內容導航 線程的啟動的實現原理 線程停止的實現原理分析 為什么中斷線程會拋出InterruptedException ...
摘要:現在終止一個線程,基本上只能靠曲線救國式的中斷來實現。中斷機制的核心在于中斷狀態和異常中斷狀態設置一個中斷狀態清除一個中斷狀態方法同時會返回線程原來的中斷的狀態。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...
摘要:線程中斷線程中斷就是一種協作機制。它并不會真正的中斷一個正在運行的線程,而只是發出中斷請求,然后由線程在下一個合適的時刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務并處理隊列中的任務 SHUTDOWN:不接收新的任務,但是處理隊列中的任務 STOP:不接收新的任務,不處理隊列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的線程數是0 TER...
摘要:我們通常使用中斷去終止線程如何中斷線程調用,向線程發送指示。當獲取到指示時,這些方法將拋出異常。捕獲這個異常,并即可中斷線程。 Interrupt ? An interrupt is an indication to a thread that it should stop what it is doing and do something else. 中斷(interupt)是一個指...
摘要:表示一個異步任務的結果,就是向線程池提交一個任務后,它會返回對應的對象。它們分別提供兩個重要的功能阻塞當前線程等待一段時間直到完成或者異常終止取消任務。此時,線程從中返回,然后檢查當前的狀態已經被改變,隨后退出循環。 0 引言 前段時間需要把一個C++的項目port到Java中,因此時隔三年后重新熟悉了下Java。由于需要一個通用的線程池,自然而然就想到了Executors。 用了...
閱讀 2109·2023-04-26 00:50
閱讀 2479·2021-10-13 09:39
閱讀 2200·2021-09-22 15:34
閱讀 1605·2021-09-04 16:41
閱讀 1336·2019-08-30 15:55
閱讀 2433·2019-08-30 15:53
閱讀 1707·2019-08-30 15:52
閱讀 748·2019-08-29 16:19