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