CountDownLatch的使用场景和代码实例

本文详细介绍了Java并发编程中的CountDownLatch,包括其应用场景、原理及代码实例。CountDownLatch是一个计数器,常用于主线程等待多个子线程执行完毕后再继续执行。文章通过具体示例展示了CountDownLatch如何实现线程间的同步,并对比了安全与不安全的并发计数方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概述

1.1 基本介绍

CountDownLatch   是JUC包中线程同步器的一种实现,又称 倒计数器 , 也就是让一个线程或者多个线程等待其他线程结束后再继续自己的操作,类似加强版 join() 。

  • countDown : 执行一次, 计数器的数值 -1。

  • await :等待计算器的值为 0,才进行后面的操作,就像一个栅栏一样。

1.2 主要应用场景

在平时的开发中,会遇到在主线程中开启多个线程去并行执行任务的业务场景,并且主线程需要等待所有的子线程都执行完毕后,再执行主线程进行汇总。这个时候就可以使用CountDownLatch(注释:CountDownLatch出现之前都是使用join来实现,但是join不够灵活)。

 

1.3 CountDownLatch原理

CountDownLatch cdl = new CountDownLatch(3);

### CountDownLatch 结合 CompletableFuture 使用方法 在 Java 并发编程中,`CountDownLatch` `CompletableFuture` 可以很好地结合起来处理复杂的并发场景。下面是一个具体的例子说明如何将两者结合使用。 #### 示例代码 假设有一个任务需要多个子任务完成后才能继续执行后续逻辑: ```java import java.util.concurrent.*; public class LatchAndFutureExample { public static void main(String[] args) throws InterruptedException { // 定义计数器初始值为3,表示有三个子任务 CountDownLatch latch = new CountDownLatch(3); // 创建一个带有自定义线程工厂的线程池 ExecutorService executor = Executors.newFixedThreadPool(3); // 存储所有的 completable futures var allFutures = new ArrayList<CompletableFuture<Void>>(); try { for (int i = 0; i < 3; ++i) { final int taskId = i; // 对于每一个子任务都创建一个新的 CompletableFuture 实例 CompletableFuture<Void> futureTask = CompletableFuture.runAsync(() -> { System.out.println("Executing task " + taskId); // 模拟耗时操作 try { Thread.sleep((long)(Math.random() * 1000)); } catch (InterruptedException e) {} // 当前子任务完成之后减少计数值 latch.countDown(); }, executor).thenRun(() -> { // 所有的 thenRun 都会在对应的 runAsync 完成后触发 System.out.println("Task " + taskId + " has finished."); }); // 添加到列表以便稍后统一处理结果 allFutures.add(futureTask); } // 主线程在此处等待直到所有子任务均已完成 latch.await(); // 统一处理各个 Future 的最终状态 CompletableFuture.allOf(allFutures.toArray(new CompletableFuture[0])).join(); System.out.println("All tasks have been completed."); } finally { executor.shutdown(); } } } ``` 此程序展示了如何利用 `CountDownLatch` 来同步一组并行运行的任务,并且通过 `CompletableFuture` 提供更强大的组合能力[^1]。 当涉及到更加复杂的应用场景时,比如某些情况下可能希望某个特定条件满足后再去启动其他依赖的操作,则可以考虑进一步探索 `CompletableFuture` 更多高级特性如 `completeOnTimeout`, `orTimeout` 等来增强灵活性响应速度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值