当前位置: 首页 > news >正文

CountDownLatch 是 Java 中的一个同步辅助工具类

下面是一个使用 `CountDownLatch` 的案例分析,我们将通过一个简单的示例来展示如何使用 `CountDownLatch` 来同步多个线程的操作。

### 场景描述
假设我们有一个任务,需要从多个数据源(比如多个数据库表或文件)中读取数据,然后进行汇总。为了确保所有数据源的数据都被读取完成,我们可以使用 `CountDownLatch` 来同步这些操作。

### 步骤

1. **初始化 CountDownLatch**:
   设置一个 `CountDownLatch` 对象,其计数器等于需要读取的数据源数量。

   ```java
   int numberOfDataSources = 3; // 假设有3个数据源
   CountDownLatch latch = new CountDownLatch(numberOfDataSources);
   ```

2. **创建并启动线程**:
   为每个数据源创建一个线程,用于读取数据。

   ```java
   for (int i = 0; i < numberOfDataSources; i++) {
       new Thread(new DataSourceReader(i, latch)).start();
   }
   ```

3. **定义任务**:
   实现 `DataSourceReader` 线程任务,用于从特定数据源读取数据,并在完成后调用 `countDown()`。

   ```java
   class DataSourceReader implements Runnable {
       private final int dataSourceNumber;
       private final CountDownLatch latch;

       public DataSourceReader(int dataSourceNumber, CountDownLatch latch) {
           this.dataSourceNumber = dataSourceNumber;
           this.latch = latch;
       }

       @Override
       public void run() {
           try {
               System.out.println("Reading data from data source " + dataSourceNumber);
               // 模拟数据读取操作
               Thread.sleep((long) (Math.random() * 1000));
               System.out.println("Data source " + dataSourceNumber + " finished reading.");
               latch.countDown(); // 数据读取完成,减少计数器
           } catch (InterruptedException e) {
               Thread.currentThread().interrupt();
           }
       }
   }
   ```

4. **等待所有线程完成**:
   在主线程中使用 `await()` 方法等待所有数据源的读取操作完成。

   ```java
   try {
       latch.await(); // 等待所有数据源读取完成
       System.out.println("All data sources have been read.");
       // 继续执行汇总操作
   } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
       System.out.println("Main thread was interrupted.");
   }
   ```

5. **执行后续操作**:
   一旦 `latch.await()` 返回,表示所有数据源的读取操作已经完成,此时可以安全地执行数据汇总或其他后续操作。

### 分析
在这个案例中,`CountDownLatch` 用于确保主线程在所有数据源的读取操作完成之前不会继续执行。这保证了数据的一致性和完整性。每个数据源的读取线程在完成其任务后通过调用 `countDown()` 来减少 `CountDownLatch` 的计数。当计数达到零时,`await()` 方法返回,主线程可以安全地继续执行。

这个案例展示了 `CountDownLatch` 在处理需要同步多个线程操作的场景中的实用性,特别是在需要等待多个异步任务完成时。
 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 线程池工具类
  • IT专业高考假期入门指南
  • 大数据期末复习——hadoop、hive等基础知识
  • C++进阶:继承和多态
  • CSS原子化
  • 2024年7月1日,公布的OpenSSH的漏洞【CVE-2024-6387】
  • 刷算法Leetcode---9(二叉树篇Ⅲ)
  • Vue.js 中属性绑定的详细解析:冒号 `:` 和非冒号的区别
  • 1125 子串与子列
  • 【3】迁移学习模型
  • 软件开发面试题(C#语言,.NET框架)
  • 【Linux进阶】Linux目录配置,FHS
  • MyBatis学习笔记-参数转义处理
  • App UI性能测试 - PerfDog使用全教程
  • 如何实现一套键盘鼠标控制两台计算机(Mouse Without Borders快速上手教程)
  • emacs初体验
  • extract-text-webpack-plugin用法
  • happypack两次报错的问题
  • Linux下的乱码问题
  • mysql_config not found
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Vue2.0 实现互斥
  • 悄悄地说一个bug
  • 如何编写一个可升级的智能合约
  • 树莓派 - 使用须知
  • 携程小程序初体验
  • 一个JAVA程序员成长之路分享
  •  一套莫尔斯电报听写、翻译系统
  • 怎么把视频里的音乐提取出来
  • ​Java基础复习笔记 第16章:网络编程
  • # wps必须要登录激活才能使用吗?
  • #100天计划# 2013年9月29日
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #QT 笔记一
  • (3)llvm ir转换过程
  • (4)Elastix图像配准:3D图像
  • (不用互三)AI绘画工具应该如何选择
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)正点原子I.MX6ULL u-boot移植
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (区间dp) (经典例题) 石子合并
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .gitignore文件_Git:.gitignore
  • .net Signalr 使用笔记
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 给NuGet包添加Readme
  • .NET建议使用的大小写命名原则
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @Bean注解详解