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,一经查实,立即删除!

相关文章

软件测试基础概念

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

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

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

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

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

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

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

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…

基于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…

数据库管理-第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…

明明jar包存在却报错找不到包名?两招教你解决java: 程序包org.springframework.context.annotation不存在问题!

一、问题提出 IDEA项目有时因为依赖库的问题出现出错&#xff1a; java: 程序包org.springframework.context.annotation不存在&#xff0c;如下图。 二、解决办法 方案1&#xff1a; 重新导入项目 ① 将项目中 .idea .iml 全部删除&#xff0c;项目重新导入 ② 用idea重新…

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

阅读须知: 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,如有侵权烦请告知,我们会立即删除…

2024计算机二级Python

1. 栈是先进先出&#xff0c;队是后进后出 2. 代码输出长度为5并不是\不占用位置&#xff0c;而是\与其后边的数字共同占用一个字符 3. 首先要弄清range函数此时表示的范围是前闭后开&#xff0c;不包含后面的数字&#xff0c;%函数表示的是余数&#xff0c;只有4是被整除的…

案例分析篇15:软件开发方法考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

ios xcode 15 PrivacyInfo.xcprivacy 隐私清单 查询应用使用的隐私api

1.需要升级mac os系统到13 兼容 xcode 15.1 2.升级mac os系统到14 兼容 xcode 15.3 3.选择 New File 4.直接搜索 privacy 能看到有个App Privacy 5.右击Add Row 7.直接选 Label Types 8.选中继续添加就能添加你的隐私清单了 苹果官网文档

每日一题——LeetCode1678.设计Goal解析器

方法一 splice 将字符串转为数组&#xff0c;对数组进行遍历&#xff0c;碰到G保持不变&#xff0c;继续循环&#xff0c;碰到 ( 看他后一位&#xff0c;是 ) 则删除两个元素&#xff0c;添加一个 o &#xff0c;不是则删除四个元素&#xff0c;添加元素 al &#xff0c;最后将…

打工人狂喜,微信管理既如此简单

微信作为一款全民的社交软件&#xff0c;已经成为人们日常生活中必不可少的通讯工具。不仅个人使用广泛&#xff0c;很多企业也依赖微信进行业务沟通和客户服务。然而&#xff0c;对于企业用户来说&#xff0c;管理多个微信号确实带来了许多繁琐和不便之处。 但是&#xff01;…

【经验分享】创建团队编程训练区,发布编程打卡题及考核

总结&#xff1a; 1、在vijos平台上创建团队编程训练区&#xff0c;管理加入的成员&#xff0c;训练区内的资源仅对成员公开&#xff1b; 2、发布编程题让团队成员进行训练&#xff0c;能够实时查询成员通关情况&#xff1b; 3、能够想发布限时考试&#xff0c;对成员进行考核。…

Java毕业设计-基于spring boot开发的实习管理系统-毕业论文+答辩ppt(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、前台功能模块2、后台功能模块2.1 管理员功能2.2 教师功能2.3 学生功能2.4 实习单位功能 四、毕设内容和源代码获取总结 Java毕业设…

全面解析unityplayer.dll丢失的5种解决方法,轻松搞定dll丢失

在使用Unity开发的游戏或应用过程中&#xff0c;如果发现系统提示“找不到unityplayer.dll”文件&#xff0c;可能会引发一系列的问题与不便。这将直接导致游戏或应用程序无法正常启动运行&#xff0c;因为unityplayer.dll是Unity引擎的核心组件之一&#xff0c;负责处理关键的…

【C语言】三种方式实现字符串(char*)/字符数组(char[ ])输入输出

前言 做题时经常需要用到字符串&#xff0c;写篇笔记加强记忆&#xff0c;本文用 4个例子实现字符串的输入输出操作。 scanf(); 从键盘输入数据时&#xff0c;遇到 “空格”、“回车” 都会终止。若要接受空格&#xff0c;使用 gets(); 代替 scanf(); 多个 scanf(); 同时出现…