并发同步计数器 CountDownLatch
概念解释
CountDownLatch 是 Java 中的一个同步辅助类,它可以让一个或多个线程等待其他线程完成操作后再继续执行。CountDownLatch 内部维护了一个计数器,当计数器的值减为0时,所有等待的线程就会被唤醒。
CountDownLatch 的主要方法包括:
- 构造方法:CountDownLatch(int count) 构造一个 CountDownLatch 对象,指定计数器的初始值为 count。
- await():让当前线程等待,直到计数器的值减为0。
- countDown():将计数器的值减1,当计数器的值减为0时,所有等待的线程会被唤醒。
CountDownLatch 的典型用法包括:
- 一个或多个线程等待其他线程完成某些操作后再继续执行。
- 主线程等待所有子线程执行完毕后再进行汇总处理。
- 多个子任务并发执行,最后汇总结果。
基本用法
// 创建一个 CountDownLatch 对象 CountDownLatch countDownLatch = new CountDownLatch(子线程个数); // 子线程1开始处理逻辑 ... // 子线程执行完所有逻辑进行计数器减1 countDownLatch.countDown(); // 子线程n开始处理逻辑 ... // 子线程执行完所有逻辑进行计数器减1 countDownLatch.countDown(); // 主线程等待所有子线程执行完 countDownLatch.await(); // 主线程继续执行后继逻辑 ...
场景
CountDownLatch 经常用于某一线程在开始运行前等待其他关联线程执行完毕的场合。
比如我们制作一张复杂报表,报表的各部分可以安排对应的一个线程进行计算,只有当所有线程都执行完毕后,再由最终的报表输出线程进行报表文件生成。
下面我们使用 CountDownLatch 实现这个例子。假设这张报表有 5 个部分,我们总共安排 5 个子线程分别计算,再设置 1 个报表输出线程用于最终生成报表文件。请看下面代码。
public class CollectionsExample2 { // 请求总数 public static int clientTotal = 5000; // 同时并发执行的线程数 public static int threadTotal = 200; private static final Set<Integer> set = Collections.synchronizedSet(Sets.newHashSet()); public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(threadTotal); final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); for (int i = 0; i < clientTotal; i++) { final int count = i; executorService.execute(() -> { try { semaphore.acquire(); update(count); semaphore.release(); } catch (Exception e) { log.error("exception", e); } countDownLatch.countDown(); }); } countDownLatch.await(); executorService.shutdown(); log.info("size:{}", set.size()); } private static void update(int i) { set.add(i); } }
本文来自博客园,作者:黄橙,转载请注明原文链接:https://www.cnblogs.com/RedOrange/p/18056678
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南