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

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

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

前言

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

使用場(chǎng)景

想想一個(gè)這樣的場(chǎng)景:我要開始吃飯,需要先滿足幾個(gè)先決條件:

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

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

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

基本原理

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

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

常用方法

//構(gòu)造器,定義計(jì)數(shù)器的初始值
public CountDownLatch(int count):
//阻塞式等待
public void await()
//超時(shí)自動(dòng)喚醒式等待
public boolean await(long timeout, TimeUnit unit)
//計(jì)數(shù)器減1,若此時(shí)計(jì)數(shù)器為0,則等待的那些線程會(huì)被喚醒
public void countDown()
//獲取當(dāng)前計(jì)數(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("出門買菜回來(lái)了");
        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é)束,我吃上飯了");
    }
}

運(yùn)行結(jié)果

注意事項(xiàng)

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

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

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

相關(guān)文章

  • Java多線程場(chǎng)景解析volatile和AtomicLong區(qū)別原理

    Java多線程場(chǎng)景解析volatile和AtomicLong區(qū)別原理

    這篇文章主要為大家介紹了Java中volatile和AtomicLong的區(qū)別原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 多個(gè)springboot項(xiàng)目如何使用一個(gè)外部共同的application.yml

    多個(gè)springboot項(xiàng)目如何使用一個(gè)外部共同的application.yml

    這篇文章主要介紹了多個(gè)springboot項(xiàng)目如何使用一個(gè)外部共同的application.yml問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring七大事務(wù)傳遞機(jī)制深入分析實(shí)現(xiàn)原理

    Spring七大事務(wù)傳遞機(jī)制深入分析實(shí)現(xiàn)原理

    實(shí)際項(xiàng)目開發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無(wú)從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)傳遞機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Java連接Redis全過(guò)程講解

    Java連接Redis全過(guò)程講解

    這篇文章主要介紹了Java連接Redis全過(guò)程講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • mybatis-plus開啟sql日志打印的三種方法

    mybatis-plus開啟sql日志打印的三種方法

    本文主要介紹了mybatis-plus開啟sql日志打印的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 解決spring-cloud-config 多服務(wù)共享公共配置的問題

    解決spring-cloud-config 多服務(wù)共享公共配置的問題

    這篇文章主要介紹了解決spring-cloud-config 多服務(wù)共享公共配置的問題,本文通過(guò)多種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • JDK8環(huán)境中使用struts2的步驟詳解

    JDK8環(huán)境中使用struts2的步驟詳解

    這篇文章主要給大家介紹了關(guān)于在JDK8環(huán)境中使用struts2的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Scala 操作Redis使用連接池工具類RedisUtil

    Scala 操作Redis使用連接池工具類RedisUtil

    這篇文章主要介紹了Scala 操作Redis使用連接池工具類RedisUtil,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問題

    nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問題

    這篇文章主要介紹了nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java ArrayList類的基礎(chǔ)使用講解

    Java ArrayList類的基礎(chǔ)使用講解

    數(shù)組的長(zhǎng)度是固定的,無(wú)法適應(yīng)數(shù)據(jù)變化的需求。為了解決這個(gè)問題,Java提供了另一個(gè)容器 java.util.ArrayList集合類,讓我們可以更便捷的存儲(chǔ)和操作對(duì)象數(shù)據(jù)。本文就將通過(guò)示例聊聊ArrayList類的基礎(chǔ)使用,感興趣的可以了解一下
    2022-10-10

最新評(píng)論