CountDownLatch是Java中用于线程同步的工具,通过倒计数机制使主线程等待多个子线程完成任务后再继续执行,适用于如批量处理、服务启动依赖等场景。

在Java多线程编程中,经常会遇到需要等待多个线程完成后再执行后续操作的场景。比如主线程需要等待一组子线程全部处理完数据后,再继续进行汇总或结束程序。这时,CountDownLatch 就是一个非常实用的工具类,它位于 java.util.concurrent 包下,能够帮助我们优雅地实现线程间的协调与同步。
CountDownLatch 可以理解为一个倒计数门闩。它通过一个指定的计数值初始化,每当某个线程完成任务后调用 countDown() 方法,计数器就会减1。而其他等待的线程可以调用 await() 方法阻塞自己,直到计数器归零,此时所有被阻塞的线程将自动唤醒并继续执行。
它的核心特点包括:
下面通过一个简单的例子来展示 CountDownLatch 的典型用法:主线程启动多个工作线程,并等待它们全部完成后再继续执行。
立即学习“Java免费学习笔记(深入)”;
public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        int threadCount = 5;
        CountDownLatch latch = new CountDownLatch(threadCount);
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">    for (int i = 0; i < threadCount; i++) {
        final int taskId = i;
        new Thread(() -> {
            try {
                System.out.println("线程 " + taskId + " 开始执行");
                Thread.sleep(1000 + (long)(Math.random() * 2000)); // 模拟耗时操作
                System.out.println("线程 " + taskId + " 执行完毕");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                latch.countDown(); // 任务完成,计数减1
            }
        }).start();
    }
    System.out.println("主线程正在等待所有子线程完成...");
    latch.await(); // 阻塞等待,直到计数为0
    System.out.println("所有子线程已完成,主线程继续执行!");
}}
在这个例子中,主线程创建了5个子线程,并传入一个初始值为5的 CountDownLatch。每个子线程执行完任务后调用 countDown(),主线程调用 await() 进行阻塞等待。当所有子线程都调用了 countDown 后,计数归零,主线程被唤醒。
有时候我们不希望无限等待,而是设置一个最长等待时间。这时可以使用 await(long timeout, TimeUnit unit) 方法。
boolean finished = latch.await(3, TimeUnit.SECONDS);
if (finished) {
    System.out.println("所有任务在规定时间内完成");
} else {
    System.out.println("等待超时,部分任务可能未完成");
}
该方法返回 boolean 值,表示是否成功等待到计数归零。如果超时前未完成,返回 false,可用于处理异常情况。
CountDownLatch 在以下场景中特别有用:
例如,在微服务启动时,可以用 CountDownLatch 等待健康检查项全部就绪:
CountDownLatch healthCheckLatch = new CountDownLatch(3);
new Thread(new DatabaseHealthChecker(healthCheckLatch)).start();
new Thread(new RedisHealthChecker(healthCheckLatch)).start();
new Thread(new MQHealthChecker(healthCheckLatch)).start();
<p>if (healthCheckLatch.await(10, TimeUnit.SECONDS)) {
System.out.println("所有健康检查通过,服务正常启动");
} else {
System.err.println("健康检查超时,服务启动失败");
}
基本上就这些。CountDownLatch 使用简单但功能强大,是并发控制中的基础工具之一。只要注意不要误用于需要重复计数的场景(这种情况下可考虑 CyclicBarrier 或 Semaphore),就能有效提升代码的可读性和稳定性。
以上就是在Java中如何使用CountDownLatch实现线程等待_CountDownLatch开发经验分享的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                 
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                            Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号