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