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時將會喚醒所有被阻塞的執行緒。
運用場景
在簡單了解完CountDownLatch
的作用後,相信各位最終目的還是想了解如何去使用,在哪些場景下使用比較合適,接下來我就拿一個對帳業務的場景詳細分析一下。
在目前的情況下,許多平台會與銀聯、微信、支付寶等支付管道對接交易,因此無法避免進行對接。對帳通常都會在每日的凌晨去處理,一方面是凌晨時間點多數平台訪問量都會較小,伺服器壓力也比較輕鬆,而且此時出帳也比較合理,所以在這個時間點做對帳也是一個大數據量計算的操作。
上面講這麼多好像都沒說到重點,在處理對帳之前首先我們肯定是需要透過各個支付管道取得對帳單文件,那麼該如何操作呢?
對帳檔案下載(第一階段):在這種情況下可以設計三個任務並發去取得對帳文件,使用
CountDownLatch
阻塞主線程,等待三個任務都取得到檔案的時候做計數遞減,最終喚醒主線將標記本階段處理完成,並發起進入下一階段的通知。對帳檔案解析(第二階段):在上個階段已下載完成的檔案檔案中,此階段要做的就是解析檔案。由於三個頻道都是不同的廠商那麼文件的內容格式肯定都是不一樣的,這時候我們又可以使用
CountDownLatch
啟動三個線程分別去解析各自的對賬文件,最終將文件內容轉換為業務所需的資料統一格式入庫,在三個任務都入庫完成後主執行緒又被喚醒標記完成後,通知下一階段開始進入工作。對帳結算(第三階段):在上一階段的資料入庫完成後,此階段要做的就是比對每一筆交易是否準確,一般都是以單號與交易管道比對交易的金額是否一致,如果金額一致則該筆交易結算成功,否則將交易判定為異常交易,併入庫處理。由上面的流程分析我們就可以設計相對合理的
CountDownLatch
計數,結合Semaphore
信號量控制並發量同時對對比交易單做並發處理,最終帶所有交易單處理完成後喚醒主執行緒標記對帳完成,並通知下一階段進行出帳。出帳(第四階段):通常平台在對帳完成後會進行出賬,也就是依照平台的業務規則出具相關的帳單方便財務人員進行統計。
以上是Java多執行緒同步工具類別CountDownLatch怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
