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

Java多線程同步工具類CountDownLatch詳解

 更新時間:2022年06月29日 11:16:42   作者:??生命猿于運動????  
這篇文章主要介紹了Java多線程同步工具類CountDownLatch詳解,CountDownLatch是一個多線程同步工具類,在多線程環(huán)境中它允許多個線程處于等待狀態(tài),直到前面的線程執(zhí)行結(jié)束

簡介

CountDownLatch是一個多線程同步工具類,在多線程環(huán)境中它允許多個線程處于等待狀態(tài),直到前面的線程執(zhí)行結(jié)束。從類名上看CountDown既是數(shù)量遞減的意思,我們可以把它理解為計數(shù)器。

核心方法

  • countDown():計數(shù)器遞減方法。
  • await():使調(diào)用此方法的線程進入等待狀態(tài),直到計數(shù)器計數(shù)為0時主線程才會被喚醒。
  • await(long, TimeUnit):在await()方法的基礎上增加了超時策略,若等待超時仍未有結(jié)果則會直接喚醒主線程運行。

CountDownLatch如何使用

在這里我們用一段簡單的代碼進行演示:

@Slf4j
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(3);
        new Thread(() -> {
            log.info("hello this is thread one");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            countDownLatch.countDown();
        }).start();
        new Thread(() -> {
            log.info("hello this is thread two");
            countDownLatch.countDown();
        }).start();
        new Thread(() -> {
            log.info("hello this is thread three");
            countDownLatch.countDown();
        }).start();
        countDownLatch.await();
        log.info("say good bye!");
    }
}

由上面的代碼可見,我們創(chuàng)建了一個CountDownLatch計數(shù)器為3和三個線程同步運行。在main主線程中調(diào)用了countDownLatch.await()方法使主線程進入阻塞。其中三個線程任務執(zhí)行完畢后都會調(diào)用countDownLatch.countDown()方法對計數(shù)器進行遞減,當三個線程任務都執(zhí)行完畢后計數(shù)器計數(shù)值為0時主線程被喚醒。

注:在創(chuàng)建CountDownLatch實例時必須定義計數(shù)器值,一般相對較合理的用法是該值的定義需要經(jīng)過合理的計算使計數(shù)值與需要并行的線程數(shù)相等,在每個線程執(zhí)行完成后做計數(shù)遞減,最終喚醒主線程繼續(xù)執(zhí)行。

  • CountDownLatch計數(shù)值設置大于線程數(shù),那么最終所有線程都執(zhí)行完了,而計數(shù)為遞減到0那么主線程將會一直處于等待狀態(tài)。
  • CountDownLatch計數(shù)值設置小于并發(fā)線程數(shù),那么可能在部分線程未執(zhí)行完畢時,計數(shù)就已經(jīng)遞減到0,則主線程會被提前喚醒。

CountDownLatch運行流程

如下圖,主線程阻塞與喚醒的核心就是計數(shù)器,只有當所有線程執(zhí)行完成計數(shù)逐個遞減最終才會喚起await()阻塞中的主線程。

注:await()可以阻塞一個線程,也可以阻塞多個線程,如果是阻塞多個線程,那么在計數(shù)為0時將會喚醒所有被阻塞的線程。

運用場景

在簡單了解完CountDownLatch的作用后,相信各位最終目的還是想了解如何去使用,在哪些場景下使用更加合適,接下來我就拿一個對賬業(yè)務的場景詳細分析一下。

相信現(xiàn)在很多平臺都會對接銀聯(lián)、微信、支付寶等支付渠道做交易,那么在這樣的場景下對賬是不可避免的。對賬通常都會在每日的凌晨去處理,一方面是凌晨時間點多數(shù)平臺訪問量都會較小,服務器壓力也比較輕松,而且此時出賬也比較合理,所以在這個時間點做對賬也是一個大數(shù)據(jù)量計算的操作。

上面講這么多好像都沒說到重點,在處理對賬之前首先我們肯定是需要通過各個支付渠道獲取對賬單文件,那么該如何操作呢?

  • 對賬文件下載(第一階段):在這種情況下可以設計三個任務并發(fā)去獲取對賬文件,使用CountDownLatch阻塞主線程,等待三個任務都獲取到文件的時候做計數(shù)遞減,最終喚醒主線將標記本階段處理完成,并發(fā)起進入下一階段的通知。
  • 對賬文件解析(第二階段):在上個階段已下載完成的文件文件中,此階段要做的就是解析文件。由于三個渠道都是不同的廠家那么文件的內(nèi)容格式肯定都是不一樣的,這時候我們又可以使用CountDownLatch啟動三個線程分別去解析各自的對賬文件,最終將文件內(nèi)容轉(zhuǎn)換為業(yè)務所需的數(shù)據(jù)統(tǒng)一格式入庫,在三個任務都入庫完成后主線程又被喚醒標記完成后,通知下一階段開始進入工作。
  • 對賬結(jié)算(第三階段):在上一階段的數(shù)據(jù)入庫完成后,此階段要做的就是比對每一筆交易是否準確,一般都是按單號與交易渠道比對交易的金額是否一致,如果金額一致則該筆交易結(jié)算成功,否則將交易判定為異常交易,并入庫處理。由上面的流程分析我們就可以設計相對合理的CountDownLatch計數(shù),結(jié)合Semaphore信號量控制并發(fā)量同時對對比交易單做并發(fā)處理,最終帶所有交易單處理完成后喚醒主線程標記對賬完成,并通知下一階段進行出賬。
  • 出賬(第四階段):通常平臺在對賬完成后會進行出賬,也就是按照平臺的業(yè)務規(guī)則出具相關的賬單方便財務人員進行統(tǒng)計。

總結(jié)

多線程并發(fā)的情況下需要做好同步處理,結(jié)合CountDownLatch充分的運用到業(yè)務場景當中還是挺有必要的,凡是需要在多個任務執(zhí)行完成后再去做另一件事的情況都可以考慮使用CountDownLatch,合理使用但請不要濫用,特別上面也提到過計數(shù)值需要確定,否則可能導致多任務無法做到同步甚至造成主線程無限等待。

到此這篇關于Java多線程同步工具類CountDownLatch詳解的文章就介紹到這了,更多相關Java CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • idea聚合工程搭建過程詳解

    idea聚合工程搭建過程詳解

    本章主要以order訂單服務來遠程調(diào)用payment支付服務為例,當然這里只是簡單的一個遠程調(diào)用,沒有太復雜的邏輯,重點是要掌握的是maven的聚合工程搭建,微服務分模塊的思想,每一個步驟我都會詳細記錄,并且文章下方還提供了git源碼地址
    2022-06-06
  • java 獲取mac地址的兩種方法(推薦)

    java 獲取mac地址的兩種方法(推薦)

    下面小編就為大家?guī)硪黄猨ava 獲取mac地址的兩種方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • SpringBoot中的YAML配置文件和日志詳解

    SpringBoot中的YAML配置文件和日志詳解

    這篇文章主要介紹了SpringBoot中的YAML配置文件和日志的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Spring-IOC容器-Bean管理-基于XML方式超詳解

    Spring-IOC容器-Bean管理-基于XML方式超詳解

    這篇文章主要介紹了Spring為IOC容器Bean的管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08
  • springboot日期格式化及時差問題分析

    springboot日期格式化及時差問題分析

    這篇文章主要介紹了springboot日期格式化,時差問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 基于SpringBoot + Android實現(xiàn)登錄功能

    基于SpringBoot + Android實現(xiàn)登錄功能

    在移動互聯(lián)網(wǎng)的今天,許多應用需要通過移動端實現(xiàn)與服務器的交互功能,其中登錄是最常見且基礎的一種功能,本篇博客將詳細介紹如何使用 Spring Boot 和 Android 實現(xiàn)一個完整的登錄功能,需要的朋友可以參考下
    2024-11-11
  • 創(chuàng)建Java線程安全類的七種方法

    創(chuàng)建Java線程安全類的七種方法

    線程安全是指某個方法或某段代碼,在多線程中能夠正確的執(zhí)行,不會出現(xiàn)數(shù)據(jù)不一致或數(shù)據(jù)污染的情況,我們把這樣的程序稱之為線程安全的,反之則為非線程安全的,下面這篇文章主要給大家介紹了關于創(chuàng)建Java線程安全類的七種方法,需要的朋友可以參考下
    2022-06-06
  • Java使用String.format方法格式化字符串的示例詳解

    Java使用String.format方法格式化字符串的示例詳解

    在編程過程中,我們經(jīng)常需要創(chuàng)建格式化的字符串來滿足特定的需求,比如生成用戶友好的消息、構(gòu)建報告或是輸出調(diào)試信息,Java 提供了一個強大的工具——String.format 方法,本文給大家介紹了Java使用String.format方法格式化字符串的示例,需要的朋友可以參考下
    2024-11-11
  • Mybatis遷移到Mybatis-Plus的實現(xiàn)方法

    Mybatis遷移到Mybatis-Plus的實現(xiàn)方法

    這篇文章主要介紹了Mybatis遷移到Mybatis-Plus的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Spring JdbcTemplate整合使用方法及原理詳解

    Spring JdbcTemplate整合使用方法及原理詳解

    這篇文章主要介紹了Spring JdbcTemplate整合使用方法及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08

最新評論

霸州市| 建宁县| 遵义市| 三门峡市| 昌图县| 安乡县| 南涧| 怀远县| 奇台县| 青岛市| 于都县| 新昌县| 青川县| 公安县| 贡嘎县| 永州市| 同仁县| 游戏| 洪泽县| 阳新县| 乌兰浩特市| 区。| 顺义区| 紫阳县| 碌曲县| 甘泉县| 且末县| 巩义市| 新宁县| 高州市| 黎川县| 北安市| 固安县| 灵宝市| 平舆县| 额敏县| 德化县| 江油市| 明溪县| 双牌县| 榆中县|