CountDownLatch详解
概述
CountDownLatch是Java并发包(java.util.concurrent)中的一种同步工具类,允许一个或多个线程等待其他线程完成操作。
核心原理
- 维护一个计数器,初始化为正数
- 每当一个任务完成,调用countDown()减1
- 调用await()的线程阻塞,直到计数器为0
基本用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { int count = 3; CountDownLatch latch = new CountDownLatch(count); for (int i = 0; i < count; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + " 完成"); } finally { latch.countDown(); } }).start(); } latch.await(); System.out.println("所有任务完成"); } }
|
常见场景
1. 等待多个任务完成
1 2 3 4 5 6
| CountDownLatch latch = new CountDownLatch(n); executors.submit(() -> { latch.countDown(); }); latch.await();
|
2. 启动多个线程后同时执行
1 2 3 4 5 6 7 8
| CountDownLatch startLatch = new CountDownLatch(1); for (int i = 0; i < n; i++) { new Thread(() -> { startLatch.await(); }).start(); } startLatch.countDown();
|
注意事项
- 计数器不能被重置
- await()可设置超时
- 不保证线程安全
总结
CountDownLatch是简单实用的线程同步工具,适用于等待多任务完成的场景。