java.util.concurrent.CountDownLatch 是一個同步輔助類,允許一個或多個線程等待其他線程完成操作。它內部維護一個計數器,計數器歸零時釋放所有等待線程。注意:計數器不可重置,屬於一次性同步屏障。
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();
}
}
await(),主線程 countDown() 一次性放行| 特性 | CountDownLatch | CyclicBarrier |
|---|---|---|
| 可重用性 | 一次性,不可重置 | 可重用,reset() 重置 |
| 適用場景 | 主線程等待子線程、多線程等待一個事件 | 多線程相互等待、分階段計算 |
| 異常處理 | 無特殊機制 | 可設置屏障動作 barrierAction |
| 計數方向 | 倒數 (count down) | 正數 (parties 到達) |
finally 塊