首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

CountDownLatch 詳解:多線程同步倒計時器的原理與實戰應用

     編輯:Java 綜合教學

CountDownLatch:讓主線程等待多個子線程完成

java.util.concurrent.CountDownLatch 是一個同步輔助類,允許一個或多個線程等待其他線程完成操作。它內部維護一個計數器,計數器歸零時釋放所有等待線程。注意:計數器不可重置,屬於一次性同步屏障。

核心 API

  • CountDownLatch(int count):初始化計數器
  • void await():阻塞當前線程,直到計數器歸零
  • boolean await(long timeout, TimeUnit unit):帶超時等待
  • void countDown():計數器減 1,歸零則喚醒所有等待者
  • long getCount():獲取當前計數

經典應用場景:並行任務聚合

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        int workerCount = 5;
        CountDownLatch latch = new CountDownLatch(workerCount);
        ExecutorService executor = Executors.newFixedThreadPool(workerCount);
        
        // 啟動 5 個子任務
        for (int i = 1; i <= workerCount; i++) {
            final int taskId = i;
            executor.submit(() -> {
                try {
                    System.out.println("任務 " + taskId + " 開始");
                    Thread.sleep(new Random().nextInt(3000)); // 模擬耗時操作
                    System.out.println("任務 " + taskId + " 完成");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } finally {
                    latch.countDown(); // 關鍵:任務結束倒數
                }
            });
        }
        
        System.out.println("主線程等待所有子任務完成...");
        latch.await(); // 阻塞直到計數器歸零
        System.out.println("所有子任務完成,主線程繼續執行聚合邏輯");
        
        executor.shutdown();
    }
}

進階用法:作為開關/閘門

  • 初始化為 1:作為「開關」,所有線程 await(),主線程 countDown() 一次性放行
  • 初始化為 N:主線程等待 N 個前置條件就緒

對比:CountDownLatch vs CyclicBarrier

特性CountDownLatchCyclicBarrier
可重用性一次性,不可重置可重用,reset() 重置
適用場景主線程等待子線程、多線程等待一個事件多線程相互等待、分階段計算
異常處理無特殊機制可設置屏障動作 barrierAction
計數方向倒數 (count down)正數 (parties 到達)

常見坑點提醒

  1. 忘記 countDown():導致主線程永久阻塞,建議放在 finally 塊
  2. 計數器初始值錯誤:與實際任務數不符
  3. 誤用於循環等待:需循環等待請用 CyclicBarrier 或 Phaser
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved