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語(yǔ)句塊,并且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í)現(xiàn)對(duì)比兩個(gè)實(shí)體類字段變化的示例詳解
我們?cè)诠ぷ髦?可能會(huì)在日志中記錄數(shù)據(jù)的變化情況或者在公共處理的數(shù)據(jù)增加一個(gè)日志頁(yè)面,我們可以根據(jù)CompareUtils工具類比較數(shù)據(jù)前后發(fā)生了怎樣的變化,下面我們就來看看具體實(shí)現(xiàn)吧2024-03-03
Java使用Optional實(shí)現(xiàn)優(yōu)雅避免空指針異常
空指針異常(NullPointerException)可以說是Java程序員最容易遇到的問題了。為了解決這個(gè)問題,Java?8?版本中推出了?Optional?類,本文就來講講如何使用Optional實(shí)現(xiàn)優(yōu)雅避免空指針異常吧2023-03-03
Object類wait及notify方法原理實(shí)例解析
這篇文章主要介紹了Object類wait及notify方法原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringSecurity OAtu2+JWT實(shí)現(xiàn)微服務(wù)版本的單點(diǎn)登錄的示例
本文主要介紹了SpringSecurity OAtu2+JWT實(shí)現(xiàn)微服務(wù)版本的單點(diǎn)登錄的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

