欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年12月12日 11:49:44   作者:bkpp976  
這篇文章主要給大家分享了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)文章

最新評論