普通 for 循環啟動線程無法保證同時執行。CountDownLatch(倒數閂)通過「等待計數歸零」機制,實現多線程精確同步啟動,是並發測試、壓力測試的標準工具。
N。countDown():計數器 -1,非阻塞。await():阻塞直到計數器歸零。public class ConcurrentTest {
public static void main(String[] args) throws InterruptedException {
int threadCount = 1000;
CountDownLatch startGate = new CountDownLatch(1); // 起跑線
CountDownLatch endGate = new CountDownLatch(threadCount); // 終點線
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
try { startGate.await(); } // 等待開槍
catch (InterruptedException e) { return; }
try { httpRequest("https://target/api"); } // 業務邏輯
finally { endGate.countDown(); }
}).start();
}
Thread.sleep(2000); // 確保所有線程就緒
long start = System.nanoTime();
startGate.countDown(); // 開槍!所有線程同時啟動
endGate.await(); // 等待全部結束
long elapsed = System.nanoTime() - start;
System.out.printf("併發 %d 請求耗時 %.2f ms, QPS %.0f%n",
threadCount, elapsed / 1e6, threadCount / (elapsed / 1e9));
}
private static void httpRequest(String url) {
// 實際 HTTP 調用邏輯
}
}
| 閂 | 計數 | await 方 | countDown 方 | 作用 |
|---|---|---|---|---|
| startGate | 1 | 所有工作線程 | 主線程 | 保證「同時起跑」 |
| endGate | N | 主線程 | 所有工作線程 | 保證「全部分統計」 |
endGate.await(30, TimeUnit.SECONDS) 防止卡死。ConcurrentLinkedQueue 或 LongAdder,主線程彙總輸出百分位數。CountDownLatch 以極簡 API 解決「多線程同步起跑/同步結束」核心痛點。並發測試不再是「大概同時」,而是「精確納秒級同步」。掌握它,是從寫測試代碼到寫專業壓測工具的分水嶺。