概念解释
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); } }
标签:int,CountDownLatch,并发,计数器,线程,countDownLatch,static From: https://www.cnblogs.com/RedOrange/p/18056678