CountDownLatch通过计数器实现线程同步,初始化指定计数值,每调用一次countDown()计数减一,当计数为零时await()阻塞的线程被唤醒继续执行,适用于主线程等待多个子任务完成的场景,如数据加载、并发测试等,但计数器不可重置,需确保countDown()调用次数与初始值一致,否则可能导致死锁。

在Java并发编程中,CountDownLatch 是一个非常实用的同步工具类,它允许一个或多个线程等待其他线程完成操作后再继续执行。它的核心机制是基于一个计数器,当计数器归零时,所有被阻塞的线程将被唤醒并继续运行。
CountDownLatch内部维护一个计数器,初始化时指定计数值(通常等于需要等待的子任务数量)。每当一个任务完成,调用 countDown() 方法使计数减一。其他线程通过调用 await() 方法阻塞自己,直到计数器变为0。
关键点:
假设我们要开发一个数据处理系统,主线程需要等待3个子线程分别从不同数据源加载数据完成后,再进行汇总分析。
立即学习“Java免费学习笔记(深入)”;
代码示例:
import java.util.concurrent.CountDownLatch;
<p>public class DataProcessor {
public static void main(String[] args) {
int taskCount = 3;
CountDownLatch latch = new CountDownLatch(taskCount);</p><pre class='brush:java;toolbar:false;'> for (int i = 1; i <= taskCount; i++) {
final int taskId = i;
new Thread(() -> {
System.out.println("线程 " + taskId + " 开始加载数据...");
try {
Thread.sleep((long)(Math.random() * 3000)); // 模拟耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("线程 " + taskId + " 数据加载完成!");
latch.countDown(); // 完成后计数减一
}).start();
}
System.out.println("主线程等待所有数据加载完成...");
try {
latch.await(); // 阻塞直到计数为0
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("所有数据已就绪,开始汇总分析!");
}}
输出可能如下:
线程 2 开始加载数据...CountDownLatch适合以下典型场景:
使用时注意:
基本上就这些,合理使用CountDownLatch能让线程协作更清晰可控。
以上就是在Java中如何使用CountDownLatch进行线程等待_CountDownLatch实战应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号