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

Java多線程正確使用倒計時協(xié)調(diào)器CountDownLatch方法詳解

 更新時間:2023年09月24日 09:17:05   作者:呆小魚LQ  
這篇文章主要為大家介紹了Java多線程倒計時協(xié)調(diào)器CountDownLatch的正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

本篇文章的代碼示例已放到 github 上,Git地址為:advance(記錄每一個學習過程),大家把代碼下載下來之后,全局搜索一些關(guān)鍵代碼,即可找到該文章的源碼。

使用場景

想想一個這樣的場景:我要開始吃飯,需要先滿足幾個先決條件:

  • 出去買菜
  • 開始做飯
  • 把做好的飯端上桌

只有滿足這幾個條件之后,我才能真正開始吃飯。同時,這里吃飯的人可能不止我一個人,或許還有我的爸爸媽媽等。

CountDownLatch可以用來實現(xiàn)一個或者多個(注意可以有多個)線程,等待其他線程完全一組特定的操作后,才開始繼續(xù)執(zhí)行的操作,這些特定的操作被稱作先決條件。

基本原理

CountDownLatch內(nèi)部有一個表示未完成的先決條件的計數(shù)器。當某個線程執(zhí)行CountDownLatch.await()時,如果此時的計數(shù)器不為0,那么這個線程就會被阻塞掉。

每當其他線程執(zhí)行CountDownLatch.countDown()時,這個計數(shù)器就會被減為0時,其他被阻塞的線程就會被自動喚醒,執(zhí)行后續(xù)的操作。

常用方法

//構(gòu)造器,定義計數(shù)器的初始值
public CountDownLatch(int count):
//阻塞式等待
public void await()
//超時自動喚醒式等待
public boolean await(long timeout, TimeUnit unit)
//計數(shù)器減1,若此時計數(shù)器為0,則等待的那些線程會被喚醒
public void countDown()
//獲取當前計數(shù)器的值
public long getCount()

使用示例

定義買菜的異步線程

public class MaiCaiThread implements Runnable{
    private CountDownLatch countDownLatch;
    public MaiCaiThread(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("出門買菜回來了");
        countDownLatch.countDown();
    }
}

定義做飯的異步線程

public class ZuoFanThread implements Runnable{
    private CountDownLatch countDownLatch;
    public ZuoFanThread(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("飯做好了");
        countDownLatch.countDown();
    }
}

定義主線程

public class Main {
    static CountDownLatch countDownLatch = new CountDownLatch(2);
    public static void main(String[] args) throws InterruptedException {
        Thread maicai = new Thread(new MaiCaiThread(countDownLatch));
        maicai.start();
        Thread zuoFanThread = new Thread(new ZuoFanThread(countDownLatch));
        zuoFanThread.start();
        System.out.println("我想吃飯了,但是飯還沒做好");
        countDownLatch.await();
        System.out.println("程序結(jié)束,我吃上飯了");
    }
}

運行結(jié)果

注意事項

countDownLatch的計數(shù)器不能循環(huán)使用,只能只用一次,若計數(shù)器已經(jīng)減為0,后續(xù)線程盡管調(diào)用await()方法,也不會生效。

如果要循環(huán)使用的話,需要使用CyclicBarrier。

以上就是Java多線程正確使用倒計時協(xié)調(diào)器CountDownLatch的詳細內(nèi)容,更多關(guān)于Java多線程CountDownLatch的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

开远市| 永济市| 阳江市| 孟连| 灌阳县| 香河县| 平泉县| 天镇县| 额济纳旗| 富平县| 临漳县| 夹江县| 思茅市| 二连浩特市| 砚山县| 彰化市| 临漳县| 仁化县| 巨鹿县| 新密市| 海城市| 龙井市| 从化市| 漳州市| 田林县| 涞水县| 西贡区| 任丘市| 从江县| 安吉县| 鱼台县| 寿阳县| 镇远县| 浦江县| 醴陵市| 保定市| 珠海市| 浪卡子县| 祁连县| 吉木萨尔县| 博野县|