# 倒計時器CountDownLatch舉例分析
## 一、CountDownLatch概述
`CountDownLatch`是Java并發包(`java.util.concurrent`)中的一個同步工具類,它允許一個或多個線程等待其他線程完成操作后再繼續執行。其核心思想是通過一個計數器來實現線程間的協調,當計數器歸零時,等待的線程將被喚醒。
### 核心方法
- `CountDownLatch(int count)`:構造函數,初始化計數器
- `countDown()`:計數器減1
- `await()`:阻塞當前線程直到計數器歸零
## 二、典型應用場景
1. **主線程等待子線程初始化完成**
2. **并行任務同步**
3. **模擬高并發測試**
4. **服務啟動前的依賴檢查**
## 三、代碼示例分析
### 場景模擬:賽跑比賽
假設有5名運動員參賽,裁判需要等待所有運動員到達終點后才能宣布比賽結束。
```java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class RaceExample {
public static void main(String[] args) throws InterruptedException {
final int RUNNER_COUNT = 5;
CountDownLatch startSignal = new CountDownLatch(1); // 發令槍
CountDownLatch finishSignal = new CountDownLatch(RUNNER_COUNT); // 終點線
for (int i = 1; i <= RUNNER_COUNT; i++) {
new Thread(new Runner(startSignal, finishSignal, "運動員"+i)).start();
}
System.out.println("裁判準備發令...");
TimeUnit.SECONDS.sleep(2); // 模擬準備時間
startSignal.countDown(); // 發令槍響
System.out.println("比賽開始!");
finishSignal.await(); // 等待所有運動員到達終點
System.out.println("所有運動員到達終點,比賽結束!");
}
}
class Runner implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch finishSignal;
private final String name;
public Runner(CountDownLatch start, CountDownLatch finish, String name) {
this.startSignal = start;
this.finishSignal = finish;
this.name = name;
}
@Override
public void run() {
try {
startSignal.await(); // 等待發令槍
System.out.println(name + "起跑...");
TimeUnit.MILLISECONDS.sleep((long)(Math.random() * 3000)); // 模擬跑步時間
System.out.println(name + "到達終點!");
finishSignal.countDown(); // 到達終點計數器減1
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
裁判準備發令...
比賽開始!
運動員1起跑...
運動員3起跑...
運動員5起跑...
運動員2起跑...
運動員4起跑...
運動員3到達終點!
運動員1到達終點!
運動員5到達終點!
運動員2到達終點!
運動員4到達終點!
所有運動員到達終點,比賽結束!
countDown()
一定會被執行特性 | CountDownLatch | CyclicBarrier | Semaphore |
---|---|---|---|
是否可重用 | 否 | 是 | 是 |
主要作用 | 等待事件完成 | 線程集合點 | 控制并發量 |
計數器變化方向 | 遞減 | 遞增 | 可增可減 |
觸發動作 | 計數到0自動觸發 | 到達屏障數執行回調 | 獲取/釋放許可 |
CountDownLatch是解決多線程協同問題的有效工具,特別適用于”主從協作”模式。理解其原理和適用場景,可以幫助我們編寫更健壯的并發程序。在實際開發中,應根據具體需求選擇合適的同步工具。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。