CountDownLatch介绍和使用

1. CountDownLatch是什么

CountDownLatch 是 Java.util.concurrent 包中的一个同步工具类,用于控制线程的执行顺序。它的主要作用是让一个或多个线程等待其他线程完成操作后再继续执行。

2. CountDownLatch 类常用方法

  1. CountDownLatch(int count) 是 CountDownLatch 类的构造函数,用于创建一个 CountDownLatch 对象并指定初始计数值。参数 count 表示初始的计数值,即等待的线程数量。当计数值变为0时,所有等待的线程将被释放。
  2. getCount(): 获取当前 CountDownLatch 的计数值。
  3. countDown(): 将 CountDownLatch 的计数减1。每次调用该方法都会使计数减少。当计数减至0时,所有等待中的线程将被释放。
  4. await(): 使当前线程等待,直到 CountDownLatch 的计数减至0。当计数为0时,该方法返回。如果计数不为0,当前线程将被阻塞,直到计数为0或线程被中断。
  5. await(long timeout, TimeUnit unit): 使当前线程等待指定的时间,直到 CountDownLatch 的计数减至0。如果在指定的时间内计数变为0,则该方法返回 true;如果在指定的时间内计数没有变为0,则该方法返回 false。

3. CountDownLatch 的用法详解

a. 初始化 CountDownLatch

首先,需要创建一个 CountDownLatch 对象,并指定需要等待的线程数量。例如,如果有5个线程需要等待,可以这样初始化 CountDownLatch。

CountDownLatch latch = new CountDownLatch(5);

b. 等待其他线程

在需要等待的线程中调用 latch.await() 方法。这会使当前线程等待,直到 CountDownLatch 的计数减到0为止。也就是说,如果初始化时指定的等待数量是5,那么只有当其他5个线程都调用了 countDown() 方法后,latch.await() 才会返回。

try {latch.await();// 等待其他线程完成后继续执行的代码
} catch (InterruptedException e) {// 处理中断异常
}

c. 完成操作

在需要等待的线程完成操作后,调用 latch.countDown() 方法来减少 CountDownLatch 的计数。每次调用 countDown() 方法都会使计数减1。

// 在需要等待的线程中执行完成操作后调用 countDown()
latch.countDown();

注意:

countDown() 方法可以在任意线程中调用,不一定需要在等待线程中调用。

使用 CountDownLatch 的典型场景是主线程等待多个子线程都完成某个操作后再继续执行。通过合理地使用 CountDownLatch,可以实现线程之间的协作和同步。

CountDownLatch 的计数是递减的,一旦计数变为0,就不能再重新设置。如果需要重新使用 CountDownLatch,需要创建一个新的实例。

4. 完整代码示例

开启10个子线程,主线程等待子线程全部完成后继续操作

public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(10);for (int i = 0; i < 10; i++) {new Thread(() -> {System.out.println("当前线程:" + Thread.currentThread().getName());try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();} finally {latch.countDown();}}).start();}System.out.println("主线程等待子线程运行结束");// 主线程等待子线程运行结束latch.await();System.out.println("子线程运行结束");System.out.println("主线程继续进行");
}

控制台输出:

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用maven命令行。手动搭建maven项目

要使用Maven命令行&#xff0c;首先需要确保已经安装了Maven。接下来&#xff0c;可以按照以下步骤手动搭建Maven项目&#xff1a; 创建项目目录&#xff1a;在命令行中切换到你希望创建项目的目录下&#xff0c;然后执行以下命令&#xff1a; mkdir myproject cd myproject初…

软件测试基础概念

一、需求 定义&#xff1a;满足用户期望或正式规定文档所需条件和技能&#xff0c;包含用户需求 用户需求&#xff1a;用户使用产品所必须完成的任务 该需求比较简略 软件需求&#xff1a;详细描述开发人员必须实现的软件功能 需求是标准&#xff0c;测试人员按照这个标准测…

python之第三方模块

配置pip源 更新pip pip install --upgrade pip 下载清华源 pip config set global.index-url Simple Index requests 用代码模拟向浏览器发送请求 #返回的是json格式&#xff0c;分页查询 import requests for i in range(0,100,10):resrequests.get(url"https://mov…

全球首个 AI 超级工程师:拥有全栈技能,一个指令就能完成整个开发过程

全球首位AI软件工程师Devin是由初创公司Cognition推出的&#xff0c;它被认为是世界上第一个完全自主的AI软件工程师[2][15]。Devin具备强大的编程和软件开发能力&#xff0c;能够在多个方面协助或完全独立地完成软件开发任务[15]。它的核心能力包括自学新语言、开发迭代App、自…

基于qt和css的MP3音乐播放器引擎开发

1 QMainWindow&#xff1a; QMainWindow 是用于创建应用程序主窗口的类。它通常用于具有菜单栏、工具栏、状态栏等标准组件的窗口。 QMainWindow 提供了一种框架&#xff0c;用于组织和管理应用程序的用户界面元素。它可以包含其他小部件&#xff08;widgets&#xff09;和布局…

C语言分析基础排序算法——归并排序

目录 归并排序 递归版本 非递归版本 非递归版本的问题 归并排序小优化 归并排序 归并排序&#xff0c;分为分治以及合并&#xff0c;分治部分可以使用递归或者非递归完成&#xff0c;归并排序的基本思路是&#xff1a;将已有序的子序列合并&#xff0c;得到完全有序的序列…

解决 :nvrtc: error: invalid value for --gpu-architecture (-arch)

核心&#xff1a;在显卡安装的cuda版本适配的pytorch中&#xff0c;更换pytorch的版本 刚遇到这个错误时&#xff0c;在网上搜索了一下&#xff0c;感谢博主1和博主2的解决方法带给我的启发。 标题服务器cuda是11.3版本&#xff0c;配置其他环境“御用”的pytorch安装语句 co…

社区维修平台|基于SpringBoot+ Mysql+Java+JSP技术的社区维修平台设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 住户后台功能 维修员前台功能 维修员后台功能 管理员功能登录 系统功能设计 数据库E…

用python实现Dubins曲线生成

Dubins曲线是连接两个具有指定方向和位置的点的最短路径&#xff0c;其中路径受到固定曲率约束&#xff08;如车辆的转向限制&#xff09;。Dubins曲线常用于机器人路径规划、车辆轨迹规划等领域。 Dubins曲线可以分为三种类型&#xff1a;CCC (Curve-Curve-Curve), CCL (Curv…

C++面试题和笔试题(四)

一、intx[6][4],(*p)[4];px;则*(p2)指向哪里&#xff1f; A X[0][1]B X[0][2]C X[1][0]D X[2][0] 官方解释&#xff1a; D int x[6][4], (*p)[4]; p x; 在这里&#xff0c;x 是一个二维数组&#xff0c;它有6行和4列。p 是一个指向具有4个整数的数组的指针。 当你执行…

DevOps-SonarQube整合Jenkins

下载SonarQube Scanner 登录Jenkins服务器&#xff0c;下载SonarQube Scanner wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip安装unzip&#xff0c;需要通过它来解压zip压缩包 yum install -y unzip解压So…

学习笔记——计算机网络(Internet、网络边缘)

一、Internet 网络是由多个计算机和其他网络设备通过通信链路相互连接而形成的互联网&#xff0c;用于实现数据传输和资源共享。它是现代信息社会中不可或缺的基础设施。 1.计算机网络&#xff1a; 通过通信链路连接&#xff1b; 以共享资源为目标&#xff1b; 资源包括&a…

基于Web的论文管理系统设计

目 录 目 录 III 摘 要 V 关键词 V Abstract VI Key Word VI 第一章 绪论 6 1.1系统设计背景 1 1.2系统设计目的与意义 1 1.3国内外现状 2 1.4本文结构 3 第二章 需求分析 3 2.1系统需求分析 4 2.2系统角色设计 4 第三章 系统开发技术 4 3.1 PHP语言简介和特点 5 3.2 Mysql数据…

【项目笔记】java微服务:黑马头条(day02)

文章目录 app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIO1)文章列表加载1.1)需求分析1.2)表结构分析1.3)导入文章数据库1.3.1)导入数据库1.3.2)导入对应的实体类 1.4)实现思路1.5)接口定义1.6)功能实现1.6.1)&#xff1a;导入heima-leadnews-article微服务&am…

学C还是学C++?

计算机专业学生&#xff0c;大一上学期学习了C语言&#xff0c;下学期学校要学C&#xff0c;请问我寒假继续深入学习C还是提前学C,大佬们有什么建议吗&#xff1f;&#xff08;个人感觉C学的不是很明白&#xff0c;链表文件什么的还不是很懂…&#xff09; 这个并没有一个统一的…

流量池增长(6)

DMP和游戏化思维 流量的运营与挖掘 DMP: Data Management Platform&#xff0c;是一种用户数据标签化的管理和应用平台 DMP的价值 精准营销运营优化 建立DMP 用户标签化&#xff1a;与其他企业进行数据标签的撞库&#xff0c;进行精准的广告投放管理&#xff1a;执行营销策略…

7-3 截取字符串7-5 单词倒排

7-3 截取字符串&#xff08;分数 25&#xff09; 作者 刘琦 单位 天津城建大学 用户在三行中分别输入一个字符串s和两个整数m,n&#xff0c;输出字符串s中位于m和n&#xff08;包括m但不包括n&#xff0c;m<n&#xff09;之间的子字符串。 输入格式: 例如&#x…

数据库管理-第160期 Oracle Vector DB AI-11(20240312)

数据库管理160期 2024-03-12 数据库管理-第160期 Oracle Vector DB & AI-11&#xff08;20240312&#xff09;1 向量的函数操作to_vector()将vector转换为标准值vector_norm()vector_dimension_count()vector_dimension_format() 2 将向量转换为字符串或CLOBvector_seriali…

I O 流

IO流 啥是流 1、IO&#xff1a;输入 \ 输出流&#xff1a;一种抽象概念&#xff0c;是对数据传输的总称&#xff0c;也就是说&#xff0c;数据在设备间的传输称为流&#xff0c;流的本质&#xff0c;是数据传输IO流&#xff0c;就是用来&#xff0c;处理设备间的数据传输问题…

Android 使用adb操作WiFi相关指令

没有系统原生设置应用又需要调试WiFi功能时&#xff0c;可以使用如下指令来验证WiFi相关功能 最常用的就是 svc wifi enable/disable&#xff0c;再使用wpa_supplicant/wpa_cli来验证&#xff0c;但对于AP功能就没办法验证了&#xff0c;其实Android有组很强大的shell指令集&a…