溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java多線程同步工具類CountDownLatch怎么使用

發布時間:2022-06-29 14:24:42 來源:億速云 閱讀:189 作者:iii 欄目:開發技術

本篇內容主要講解“Java多線程同步工具類CountDownLatch怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java多線程同步工具類CountDownLatch怎么使用”吧!

簡介

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

核心方法

  • countDown():計數器遞減方法。

  • await():使調用此方法的線程進入等待狀態,直到計數器計數為0時主線程才會被喚醒。

  • await(long, TimeUnit):在await()方法的基礎上增加了超時策略,若等待超時仍未有結果則會直接喚醒主線程運行。

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!");
    }
}

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

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

  • CountDownLatch計數值設置大于線程數,那么最終所有線程都執行完了,而計數為遞減到0那么主線程將會一直處于等待狀態。

  • CountDownLatch計數值設置小于并發線程數,那么可能在部分線程未執行完畢時,計數就已經遞減到0,則主線程會被提前喚醒。

CountDownLatch運行流程

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

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

Java多線程同步工具類CountDownLatch怎么使用

運用場景

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

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

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

  • 對賬文件下載(第一階段):在這種情況下可以設計三個任務并發去獲取對賬文件,使用CountDownLatch阻塞主線程,等待三個任務都獲取到文件的時候做計數遞減,最終喚醒主線將標記本階段處理完成,并發起進入下一階段的通知。

  • 對賬文件解析(第二階段):在上個階段已下載完成的文件文件中,此階段要做的就是解析文件。由于三個渠道都是不同的廠家那么文件的內容格式肯定都是不一樣的,這時候我們又可以使用CountDownLatch啟動三個線程分別去解析各自的對賬文件,最終將文件內容轉換為業務所需的數據統一格式入庫,在三個任務都入庫完成后主線程又被喚醒標記完成后,通知下一階段開始進入工作。

  • 對賬結算(第三階段):在上一階段的數據入庫完成后,此階段要做的就是比對每一筆交易是否準確,一般都是按單號與交易渠道比對交易的金額是否一致,如果金額一致則該筆交易結算成功,否則將交易判定為異常交易,并入庫處理。由上面的流程分析我們就可以設計相對合理的CountDownLatch計數,結合Semaphore信號量控制并發量同時對對比交易單做并發處理,最終帶所有交易單處理完成后喚醒主線程標記對賬完成,并通知下一階段進行出賬。

  • 出賬(第四階段):通常平臺在對賬完成后會進行出賬,也就是按照平臺的業務規則出具相關的賬單方便財務人員進行統計。

到此,相信大家對“Java多線程同步工具類CountDownLatch怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女