CountDownLatch

CountDownLatch #

使用 #

new一个CountDownLatch,需要指定计数器值,表示需要等待执行完毕的线程数量

开启多个线程执行任务,并调用CountDownLatch对象的await方法,开始等待任务执行
每个线程的任务执行完后,都要调用CountDownLatch对象的countDown方法

当调用countDown方法的线程数达到计数器值时,多线程任务执行完毕,await方法的等待状态被取消,外层逻辑继续向下执行

CountDownLatch latch = new CountDownLatch(3);

// 创建并启动 3 个工作线程
for (int i = 0; i < 3; i++) {
    final int taskId = i;
    new Thread(() -> {
        try {
            System.out.println("任务" + taskId + "开始执行");
            // 执行...
            System.out.println("任务" + taskId + "完成");
        } catch (Exception e) {
            // ...
        } finally {
            // 任务完成后,计数器减 1
            latch.countDown();
        }
    }).start();
}

// 主线程等待,直到计数器变为 0
System.out.println("主线程等待所有任务完成...");
latch.await();
System.out.println("所有任务已完成,主线程继续执行");

原理 #

CountDownLatch基于AbstractQueuedSynchronized(AQS)实现
await方法被调用时,主线程进入等锁队列
countDown方法被调用时,CountDownLatch对象内部计数器-1
CountDownLatch对象内部计数器为0时,主线程被唤醒,继续执行任务