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.hqwc.cn/news/535854.html

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

相关文章

【C++ Boost库】原始计时器

文章目录 前言一、原始计时器1.1 timer定时器timer类的介绍异常安全代码概况 1.2 progress_timer类如何使用异常安全代码概况 1.3 progress_display类如何使用代码概况 总结 前言 在现代软件开发中&#xff0c;时间是一种不可逆转的资源。特别是在需要按时执行任务、调度事件或…

鸿蒙开发月薪过万,背后的秘密~

自从智联招聘公布出春节后首周的岗位需求数据后&#xff0c;鸿蒙开发岗位就被推上了热潮&#xff01;鸿蒙相关职位数同比增长163%&#xff0c;投递人数同比增长349%&#xff0c;即分别增至去年同期的2.6倍、4.5倍&#xff0c;涨势突出。 于是我的朋友圈中就有人去市场中简单探…

mybatisplus使用基本步骤

1.设计实体类&#xff0c;给实体类加一些需要的注解 2.创建Service接口继承mybatisplus提供的 IService<实体类>接口 3.实现Service接口&#xff0c;并继承mybatisplus提供的 ServiceImpl<mapper接口&#xff0c;实体类>类 4.mapper接口继承mybatisplus提供的 B…

程序人生——Java中基本类型使用建议

目录 引出Java中基本类型使用建议建议21&#xff1a;用偶判断&#xff0c;不用奇判断建议22&#xff1a;用整数类型处理货币建议23&#xff1a;不要让类型默默转换建议24&#xff1a;边界、边界、还是边界建议25&#xff1a;不要让四舍五入亏了一方 建议26&#xff1a;提防包装…

数据结构——通讯录项目

1.通讯录的介绍 顺序表是通讯录的底层结构。 通讯录是将顺序表的类型替换成结构体类型来储存用户数据&#xff0c;通过运用顺序表结构来实现的。 用户数据结构&#xff1a; typedef struct PersonInfo {char name[12];char sex[10];int age;char tel[11];char addr[100]; }…

ai一键生成思维导图!这5款ai软件口碑爆棚!

从去年到现在&#xff0c;AI 人工智能经过一年多的发展普及&#xff0c;正逐渐被越来越多的人所接受和使用&#xff0c;它从最初的 AI 文本生成&#xff0c;逐步过渡到图片生成&#xff08;AI 绘画&#xff09;、思维导图 AI 生成&#xff08;AI 绘图&#xff09;、PPT 演示文稿…

【XMU学科实践二】豆瓣爬虫实践

文章目录 分析豆瓣阅读网站完整爬虫代码 叠甲&#xff1a;仅供学习。。 XMU的小朋友实在不会了可以参考我的思路&#xff0c;但还是建议自己敲一遍哈。 学科实践二还是挺有意思的&#xff01; 分析豆瓣阅读网站 豆瓣阅读出版页面 打开浏览器开发者工具&#xff0c;可以看到如下…

JDK默认的垃圾回收器是什么?

在不同版本的Java开发工具包&#xff08;JDK&#xff09;中&#xff0c;JDK默认的垃圾回收器可能会有所不同。然而&#xff0c;自从Java 9发布后&#xff0c;G1&#xff08;Garbage-First&#xff09;垃圾回收器成为了Java平台的默认垃圾回收器。在此之前&#xff0c;Java 8及之…

php apache 后台超时设置

最近在写一个thinkphp项目的时候&#xff0c;发现Ajax从后端请求数据时间比较长&#xff0c;大概需要45秒左右&#xff0c;但是一旦请求时间超过40s&#xff0c;页面就会超时500了&#xff0c;一开始以为是ajax请求时间不能太长&#xff0c;后来将Ajax请求改为同步且timeout设置…

Navicat操作MYSQL

Navicat操作MYSQL 数据表的操作-创建表数据表的操作-修改、删除表数据的操作数据类型与约束常用数据类型数据约束 数据库备份与还原数据库的备份数据表的还原 数据表的操作-创建表 数据表的操作-修改、删除表 数据的操作 数据类型与约束 常用数据类型 整型&#xff1a;int 有符…

JVM 类的加载篇

我们都知道一个类从加载到卸载一共分为七个过程 加载 - 链接(验证 - 准备 - 解析) - 初始化 - 使用 - 卸载 下文我们将详细解析这些过程 谁需要加载? 在Java中数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预定义,引用数据类型则需要类的加载 1.加载/装载(loa…