CountDownLatch 使用详情

在这里插入图片描述
CountDownLatch 是 Java.util.concurrent 包下的一个类,它可以用来实现一个或多个线程等待其他线程完成后再继续执行的场景。

CountDownLatch 类中有一个计数器,每次调用 countDown() 方法计数器的值减1,当计数器的值变为0时,调用 await() 方法的线程就会被唤醒,继续执行。

CountDownLatch 的使用一般包括以下几个步骤:

  1. 创建一个 CountDownLatch 对象,并指定计数器的初始值。
  2. 在需要等待的线程中调用 await() 方法,进入等待状态。
  3. 在其他线程中完成任务后,调用 countDown() 方法,计数器的值减1。
  4. 当计数器的值变为0时,被等待的线程会被唤醒,继续执行。

下面是一个使用 CountDownLatch 的简单案例:

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {// 创建一个 CountDownLatch 对象,初始计数器的值为3CountDownLatch latch = new CountDownLatch(3);// 创建三个线程,每个线程执行任务后调用 countDown() 方法Thread thread1 = new Thread(new Task(latch, "Task 1"));Thread thread2 = new Thread(new Task(latch, "Task 2"));Thread thread3 = new Thread(new Task(latch, "Task 3"));// 启动三个线程thread1.start();thread2.start();thread3.start();// 主线程调用 await() 方法等待计数器变为0latch.await();// 当计数器变为0时,主线程继续执行System.out.println("All tasks have been completed.");}
}class Task implements Runnable {private CountDownLatch latch;private String name;public Task(CountDownLatch latch, String name) {this.latch = latch;this.name = name;}@Overridepublic void run() {System.out.println(name + " is running.");// 模拟任务执行时间try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + " is completed.");// 任务完成后调用 countDown() 方法latch.countDown();}
}

在上面的例子中,我们创建了一个 CountDownLatch 对象,计数器的初始值为3。然后创建了三个线程,每个线程执行任务后调用 countDown() 方法。在主线程中调用 await() 方法等待计数器的值变为0,当计数器的值变为0时,主线程继续执行并输出 “All tasks have been completed.”。每个线程的任务模拟了一个耗时的操作,当任务完成后调用 countDown() 方法,计数器的值减1。当计数器的值减到0时,主线程被唤醒,继续执行。

CountDownLatch 的使用场景包括:

  • 主线程等待多个子线程完成后再继续执行。
  • 多个子线程等待某个主线程发出信号后再同时执行。
  • 控制并发线程的执行顺序,比如先执行A线程,再执行B线程。

需要注意的是,CountDownLatch 的计数器一旦减到0后就不能再重新设置,如果需要多次使用可以考虑使用 CyclicBarrier 类。另外,CountDownLatch 是一次性的,一旦计数器的值变为0后,再次调用 await() 方法会直接通过,不会再等待。

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

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

相关文章

从零开始学习 Java:简单易懂的入门指南之API、String类(八)

常用API 1.API1.1API概述1.2如何使用API帮助文档 2.String类2.1String类概述2.2String类的特点2.3String类的构造方法2.4创建字符串对象两种方式的区别2.5字符串的比较2.5.1号的作用2.5.2equals方法的作用 2.6用户登录案例2.6.1案例需求2.6.2代码实现 2.7遍历字符串案例2.7.1案…

【MySQL】sql字段约束

在MySQL中,我们需要存储的数据在特定的场景中需要不同的约束。当新插入的数据违背了该字段的约束字段,MySQL会直接禁止插入。 数据类型也是一种约束,但数据类型这个约束太过单一;比如我需要存储的是一个序号,那就不可…

IP核之fifo

一.FIFO简介 FIFO (First In First Out,即先入先出),是一种数据缓冲器,用来实现数据先入先出的读写方式。 二,FIFO实现原理 FIFO是采用一种先入先出的实现原理 就如图按照D1到D10的顺序输入那么读取的时候也是按照D…

el-table合并表头、动态合并列、合并尾部合计

在有些情况下,我们会有合并表头、合并列、合并尾部合计的需求,这篇文章是为了记录,如何进行合并,方便日后翻阅。 效果图 el-table合并表头 el-table合并列(动态合并) el-table合并尾部合计 el-table合并表…

看门狗文章

1. iwdg.c #include "stm32f4xx.h" #include "iwdg.h"//prer:预分频值 //rlr:自动重装载值 void IWDG_Init(unsigned char prer,unsigned int rlr)//IWDG初始化 {IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);…

知网期刊《中阿科技论坛》简介及投稿须知

知网期刊《中阿科技论坛》简介及投稿须知 主管单位:宁夏回族自治区科学技术厅 主办单位:宁夏回族自治区对外科技交流中心(中国一阿拉伯国家技术转移中心) 刊  期:月刊 国际刊号:ISSN 2096-7268 国内刊号:CN 64-…

SystemVerilog scheduler

文章目录 简介调度器simulation regionPreponed regionActive regionInactive regionNBA(Non-blocking Assignment Events region)Observed regionReactive regionRe-Inactive Events regionRe-NBA RegionPostponed Region PLI region:Pre-active regionPre-NBA regionPost-NBA…

空地协同智能消防系统——无人机、小车协同

1 题目 1.1 任务 设计一个由四旋翼无人机及消防车构成的空地协同智能消防系统。无人机上安装垂直向下的激光笔,用于指示巡逻航迹。巡防区域为40dm48dm。无人机巡逻时可覆盖地面8dm宽度区域。以缩短完成全覆盖巡逻时间为原则,无人机按照规划航线巡逻。发…

面试热题(字符串相加)

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 输入:num1 "11"…

Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比

1、gdb和pdb分别是什么? 1.1、gdb GDB(GNU Debugger)是一个功能强大的命令行调试工具,由GNU项目开发,用于调试C、C等编程语言的程序。它在多个操作系统中都可以使用,包括Linux、MacOS和Windows&#xff0…

SpringSecurity5.7+最新案例 -- 授权 --

一、前提 书接上回 SpringSecurity5.7最新案例 – 用户名密码验证码记住我 本文 继续处理SpringSecurity授权 … 目前由 难 -> 简,即自定义数据库授权,注解授权,config配置授权 二、自定义授权 0. 数据准备 SET NAMES utf8mb4; SET …

开窗积累之学习更新版

1. 开窗使用1之 count range between current row and current row 将相同排序字段的值进行函数计算 selectsku_id,substr(create_date,1,7) date_month,order_id,create_date,sku_num*price,sum(sku_num*price) over (partition by sku_id order by substr(create_date,1,7)…