java 兩階段終止線程的正確做法
一、怎么優(yōu)雅地關(guān)閉一個(gè)線程?
在一個(gè)線程T1中如何優(yōu)雅地關(guān)閉線程T2(也就是說要給T2一個(gè)機(jī)會(huì)釋放持有的資源)?
1.錯(cuò)誤做法
使用stop()方法停止線程:
stop()
方法會(huì)真正殺死線程,如果此時(shí)該線程持有鎖,那么其他線程將永遠(yuǎn)無法獲取鎖。
使用System.exit()方法停止線程:
會(huì)讓整個(gè)進(jìn)程都退出
2.正確做法
思路:
代碼實(shí)現(xiàn):
public class Test { public static void main(String[] args) throws InterruptedException { TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination(); twoPhaseTermination.start(); Thread.sleep(3000); twoPhaseTermination.stop(); } } class TwoPhaseTermination{ // 監(jiān)控線程 private Thread monitorThread; public void start(){ monitorThread = new Thread(()->{ Thread current = Thread.currentThread(); while(true){ if(current.isInterrupted()){ System.out.println("線程要關(guān)閉了..."); break; } try { Thread.sleep(1000); // 階段1 System.out.println("監(jiān)控線程正在工作...."); // 階段2 // 如果在階段2被打斷,線程的isInterrupted標(biāo)志位為true,會(huì)捕抓到信號(hào)并關(guān)閉線程 // 如果在階段1被打斷,會(huì)進(jìn)入catch語句塊,并且isInterrupted標(biāo)志位清空,無法關(guān)閉線程 } catch (InterruptedException e) { e.printStackTrace(); // 需要重新設(shè)置isInterrupted標(biāo)志位為true monitorThread.interrupt(); } } }); // 啟動(dòng)線程 monitorThread.start(); } public void stop(){ // 設(shè)置isInterrupted標(biāo)志位true monitorThread.interrupt(); } }
運(yùn)行結(jié)果:
兩階段關(guān)閉線程:
二、要點(diǎn)
為什么需要在catch代碼塊中重新執(zhí)行monitorThread.interrupt()?
因?yàn)?code>Thread.sleep()執(zhí)行過程中被打斷,isInterrupted標(biāo)志位會(huì)清空,下一次進(jìn)入while
循環(huán)就會(huì)忽略這次打斷,繼續(xù)運(yùn)行線程。
演示一下把monitorThread.interrupt()注釋掉的結(jié)果:
可以看到,會(huì)忽略這次的isInterrupted信號(hào),繼續(xù)運(yùn)行線程。
到此這篇關(guān)于java 兩階段終止線程的正確做法的文章就介紹到這了,更多相關(guān)java 兩階段終止線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)
下面小編就為大家?guī)硪黄趈ava集合中的一些易混淆的知識(shí)點(diǎn)(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12淺談Spring Boot 開發(fā)REST接口最佳實(shí)踐
這篇文章主要介紹了淺談Spring Boot 開發(fā)REST接口最佳實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01零基礎(chǔ)入門學(xué)習(xí)——Spring Boot注解(一)
這篇文章主要介紹了Spring Boot注解學(xué)習(xí)(一)要點(diǎn),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-05-05MyBatis一對(duì)一級(jí)聯(lián)更新問題小結(jié)
日常工作中經(jīng)常會(huì)涉及到一對(duì)一級(jí)聯(lián)更新的問題,本文主要介紹了MyBatis一對(duì)一級(jí)聯(lián)更新問題小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01springboot Jpa多數(shù)據(jù)源(不同庫(kù))配置過程
這篇文章主要介紹了springboot Jpa多數(shù)據(jù)源(不同庫(kù))配置過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05