最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 兩階段終止線程的正確做法

 更新時(shí)間:2021年12月12日 11:49:44   作者:bkpp976  
這篇文章主要給大家分享了java 兩階段終止線程的正確做法,文章列舉出錯(cuò)誤的做法與正確做法做對(duì)比,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助

一、怎么優(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)文章

  • 解讀nacos獲取配置文件的大致過程

    解讀nacos獲取配置文件的大致過程

    這篇文章主要介紹了nacos獲取配置文件的大致過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • log4j的配置文件詳細(xì)解析

    log4j的配置文件詳細(xì)解析

    以下小編主要為大家介紹一下log4j的配置文件各個(gè)配置項(xiàng)的含義。需要的朋友可以過來參考下
    2013-08-08
  • Java實(shí)現(xiàn)對(duì)比兩個(gè)實(shí)體類字段變化的示例詳解

    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)雅避免空指針異常

    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í)例解析

    這篇文章主要介紹了Object類wait及notify方法原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳解Log4j 日志文件存放位置設(shè)置

    詳解Log4j 日志文件存放位置設(shè)置

    這篇文章主要介紹了詳解Log4j 日志文件存放位置設(shè)置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 深入理解HashMap各個(gè)方法的源碼

    深入理解HashMap各個(gè)方法的源碼

    這篇文章主要介紹了深入理解HashMap各個(gè)方法的源碼,HashMap初始容量不能為負(fù)數(shù),若初始容量大于最大容量,則讓它等于最大容量,負(fù)載因子必須大于0,并且傳入的initialCapacity不是HashMap的容量大小,需要的朋友可以參考下
    2023-12-12
  • SpringSecurity OAtu2+JWT實(shí)現(xiàn)微服務(wù)版本的單點(diǎn)登錄的示例

    SpringSecurity OAtu2+JWT實(shí)現(xiàn)微服務(wù)版本的單點(diǎn)登錄的示例

    本文主要介紹了SpringSecurity OAtu2+JWT實(shí)現(xiàn)微服務(wù)版本的單點(diǎn)登錄的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Spring多個(gè)數(shù)據(jù)源配置詳解

    Spring多個(gè)數(shù)據(jù)源配置詳解

    在實(shí)際場(chǎng)景中,會(huì)有需要配置多個(gè)數(shù)據(jù)源的場(chǎng)景,本文就介紹一下如何配置Spring多數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • springboot log多環(huán)境配置方式

    springboot log多環(huán)境配置方式

    這篇文章主要介紹了springboot log多環(huán)境配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

雅江县| 瑞安市| 上栗县| 佛山市| 大港区| 山西省| 攀枝花市| 雷山县| 安宁市| 盐津县| 商南县| 商城县| 松溪县| 小金县| 荥经县| 韶山市| 平湖市| 教育| 靖西县| 长乐市| 阿拉善左旗| 蓝山县| 本溪| 凯里市| 浙江省| 七台河市| 本溪| 包头市| 红桥区| 临澧县| 哈密市| 师宗县| 友谊县| 乌拉特中旗| 巴里| 富民县| 伊金霍洛旗| 图片| 巨野县| 慈利县| 巴马|