CountDownLatch是Java中用于线程同步的工具,通过计数器控制线程等待;初始化指定计数值,调用countDown()递减,await()阻塞线程直到计数为零,实现主线程等待多线程完成或统一触发多线程执行,且计数器不可重置,适用于一次性同步场景。

在多线程编程中,经常需要控制多个线程的执行顺序或等待某些任务完成后再继续。Java 提供了 CountDownLatch 工具类来实现这种线程间的协调。它基于一个计数器,当计数器归零时,所有被阻塞的线程将被唤醒并继续执行。
CountDownLatch 是 java.util.concurrent 包下的一个同步工具类,它允许一个或多个线程等待其他线程完成一组操作。它的核心机制是通过一个初始化的计数值,调用 countDown() 方法递减计数,而调用 await() 的线程会阻塞直到计数变为 0。
典型使用场景包括:
假设我们要启动 3 个线程执行任务,主线程需要等它们全部完成后才打印“所有任务完成”。
立即学习“Java免费学习笔记(深入)”;
import java.util.concurrent.CountDownLatch;
public class Worker implements Runnable {
    private CountDownLatch latch;
    public Worker(CountDownLatch latch) {
        this.latch = latch;
    }
    @Override
    public void run() {
        try {
            // 模拟任务执行
            System.out.println(Thread.currentThread().getName() + " 正在工作...");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            latch.countDown(); // 任务完成,计数减一
        }
    }
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3); // 计数设为3
        Thread t1 = new Thread(new Worker(latch), "Worker-1");
        Thread t2 = new Thread(new Worker(latch), "Worker-2");
        Thread t3 = new Thread(new Worker(latch), "Worker-3");
        t1.start();
        t2.start();
        t3.start();
        latch.await(); // 主线程阻塞,直到计数为0
        System.out.println("所有工作线程已完成,主线程继续执行。");
    }
}输出示例:
Worker-1 正在工作... Worker-2 正在工作... Worker-3 正在工作... 所有工作线程已完成,主线程继续执行。
有时我们希望多个线程准备好后,由主线程统一发令同时开始执行。这时可以将 CountDownLatch 初始化为 1,让所有子线程调用 await() 等待,主线程调用 countDown() 触发执行。
import java.util.concurrent.CountDownLatch;
public class RaceExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch startSignal = new CountDownLatch(1);
        for (int i = 1; i <= 3; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " 准备就绪,等待起跑信号...");
                    startSignal.await(); // 所有线程在此等待
                    System.out.println(Thread.currentThread().getName() + " 开始奔跑!");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }, "Runner-" + i).start();
        }
        Thread.sleep(2000); // 模拟准备时间
        System.out.println("发令枪响!");
        startSignal.countDown(); // 发令,所有线程同时开始
    }
}这种模式常用于性能测试或并发场景模拟,确保多个线程真正“同时”启动。
使用 CountDownLatch 虽然简单,但也要注意以下几点:
例如使用超时机制:
```java if (latch.await(5, TimeUnit.SECONDS)) { System.out.println("所有任务在5秒内完成"); } else { System.out.println("等待超时,部分任务可能未完成"); } ```基本上就这些。CountDownLatch 是实现线程依赖控制的轻量级方案,理解其“倒计数、一次性、等待归零”的特性,就能在合适的场景中有效使用。
以上就是在Java中如何使用CountDownLatch实现线程依赖控制_CountDownLatch实践指南的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号