CountDownLatch用法、详解

目录

​编辑

概述:

应用场景:

优点:

缺点:

主要方法:

1. `CountDownLatch(int count)`:

2. `void await()`:

3. `boolean await(long timeout, TimeUnit unit)`:

4. `void countDown()`:

案例:

1、猴哥吃蕉====await()

执行结果:

分析:

2、猴哥吃蕉====await(5, TimeUnit.SECONDS);

执行结果

分析:

总结:


概述:

`CountDownLatch`是Java并发包中的一个同步工具类,用于控制线程的执行顺序和协调多个线程之间的操作。它通过一个计数器来实现,计数器的初始值由用户指定,每当一个线程完成了特定任务或达到了某个状态,计数器的值就会减少。当计数器的值变为0时,等待`CountDownLatch`的线程将被释放。

应用场景:

`CountDownLatch`常用于以下场景:

1. 主线程等待多个子线程完成任务后再继续执行。

2. 多个线程等待某个共享资源就绪后再同时开始执行。

3. 控制多个线程按照特定的顺序执行。

优点:

1. 简单易用:`CountDownLatch`提供了简单的接口,易于使用和理解。

2. 灵活性:可以根据实际需求设置等待的线程数量,可以灵活地控制线程的执行顺序和协调多个线程之间的操作。

缺点:

1. 一次性:`CountDownLatch`的计数器只能减少到0,一旦减少到0后,无法重置计数器,因此只能使用一次。

2. 无法逆转:一旦计数器的值减少到0,等待线程将被释放,无法再次等待。

主要方法:

1. `CountDownLatch(int count)`:

构造函数,用于创建一个`CountDownLatch`对象,并指定需要等待的线程数量。

2. `void await()`:

使当前线程等待,直到`count`值减少到0。它会阻塞当前线程,直到所有线程都调用了`countDown()`方法,如果`count`值已经为0,则该方法立即返回。

3. `boolean await(long timeout, TimeUnit unit)`:

方法与`await()`方法类似,但它还接受一个超时时间参数。使当前线程等待,直到`count`值减少到0或超过指定的超时时间。如果在超时时间内`count`值变为0,则返回`true`;如果超过超时时间仍未达到0,则返回`false`。

4. `void countDown()`:

将`count`值减少1。当某个线程完成了特定任务或达到了某个状态时,应调用此方法来减少`count`值。

案例:

1、猴哥吃蕉====await()
import java.util.concurrent.CountDownLatch;/*** 猴哥*/
public class MonkeyBanana extends Thread {CountDownLatch countDownLatch;String name;public MonkeyBanana(String name, CountDownLatch countDownLatch) {this.name = name;this.countDownLatch = countDownLatch;}@Overridepublic void run() {System.out.println(name + "开始吃香蕉");try {long l = (long) (Math.random() * 10000);Thread.sleep(l);if (l / 1000 == 0) {System.out.println(name + "简直不要太厉害了,跟我们表演了一波一口闷香蕉!");} else if (l / 1000 > 0 && l / 1000 < 5) {System.out.println(name + "在" + l / 1000 + "秒内吃完了香蕉!");} else if (l / 1000 == 5) {System.out.println(name + "在最后1秒内吃完了香蕉!");} else if (l / 1000 > 5) {System.out.println(name + "在" + l / 1000 + "秒内吃完了香蕉,已超时!");}} catch (InterruptedException e) {e.printStackTrace();} finally {countDownLatch.countDown();//线程倒数器-每次都会减1}}
}

import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;public class CountDownLatchTest {public static void main(String[] args) {monkeyEatAwait();}/*** 猴哥吃香蕉*/public static void monkeyEatAwait() {try {//倒数器记数CountDownLatch downLatch = new CountDownLatch(1);System.out.println("猴哥吃香蕉大赛预备::");//倒数3个数for (int i = 3; i > 0; i--) {System.out.println("倒数 : " + i);TimeUnit.SECONDS.sleep(1);}downLatch.countDown();downLatch.await();System.out.println("BOOM 开始!");//几个猴哥再比赛int monkeyNum = 5;//需要等待的线程数量。也就是说,这些线程执行完之后才会往下继续走CountDownLatch countDownLatch = new CountDownLatch(monkeyNum);for (int i = 0; i < monkeyNum; i++) {new MonkeyBanana("猴哥" + (i + 1), countDownLatch).start();}//等待所有猴哥都吃完香蕉countDownLatch.await();System.out.println("所有猴哥都吃完了香蕉!");} catch (Exception e) {e.printStackTrace();}}
}
执行结果:

分析:

这个是等待所有猴哥都吃完香蕉。也就是所有的子线程任务都走完之后才会走主线程,执行主线程方法。

2、猴哥吃蕉====await(5, TimeUnit.SECONDS);

import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;public class CountDownLatchTest {public static void main(String[] args) {monkeyEatAwaitPar();}/*** 猴哥吃香蕉*/public static void monkeyEatAwaitPar() {try {//倒数器记数CountDownLatch downLatch = new CountDownLatch(1);System.out.println("猴哥吃香蕉大赛预备::");//倒数3个数for (int i = 3; i > 0; i--) {System.out.println("倒数 : " + i);TimeUnit.SECONDS.sleep(1);}downLatch.countDown();downLatch.await();System.out.println("BOOM 开始!");//几个猴哥再比赛int monkeyNum = 5;//需要等待的线程数量。也就是说,这些线程执行完之后才会往下继续走CountDownLatch countDownLatch = new CountDownLatch(monkeyNum);for (int i = 0; i < monkeyNum; i++) {new MonkeyBanana("猴哥" + (i + 1), countDownLatch).start();}//超时判断boolean await = countDownLatch.await(5, TimeUnit.SECONDS);//超过5秒结束比赛if (!await) {System.out.println("时间到!");} else {System.out.println("所有猴哥都吃完了香蕉!");}} catch (Exception e) {e.printStackTrace();}}
}
执行结果

分析:

这里我们用了带入参的await方法,判断如果吃香蕉时间超出5秒钟,则算是失败!可以处理特殊情况下线程卡死,超时等状态。

总结:

`CountDownLatch`是一个非常有用的同步工具,适用于需要等待多个线程完成任务或达到某个状态后再继续执行的场景。它简单易用,但只能使用一次且无法逆转。在合适的场景下,使用`CountDownLatch`可以有效地实现线程之间的同步和协调。

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

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

相关文章

MuMu模拟器12如何连接adb?

一、MuMu模拟器12端口查看 MuMu模拟器12现已支持adb同时连接多个模拟器进行调试的操作&#xff0c;可以参考以下步骤操作&#xff0c;查看MuMu模拟器12本体以及多开模拟器的adb端口&#xff1a; 单开的MUMU模拟器12可通过模拟器右上角菜单-问题诊断&#xff0c;获取ADB调试端…

分层自动化测试的实战思考!

自动化测试的分层模型 自动化测试的分层模型&#xff0c;我们应该已经很熟悉了&#xff0c;按照分层测试理念&#xff0c;自动化测试的投入产出应该是一个金字塔模型。越是向下&#xff0c;投入/产出比就越高&#xff0c;但开展的难易程度/成本和技术要求就越高&#xff0c;但…

决战排序之巅(一)

决战排序之巅 插入排序直接插入排序 void InsertSort(int* arr, int n)希尔排序 void ShellSort(int* arr, int n)测试插入排序测试函数 void verify(int* arr, int n)测试 InsertSort测试 ShellSort测试速度 InsertSort & ShellSort 选择排序直接选择排序 void SelectSort…

前端带你学后端系列 ①【RocketMQ】

前端带你学后端系列 ①【RocketMQ】 Ⅰ 我们为什么要用RocketMQ&#xff1f;这个中间件有啥作用&#xff1f;Ⅱ RocketMQ 的组成元素Ⅲ RocketMQ 的系统架构Ⅳ 消息是怎么发送的&#xff1f;又是怎么存储的&#xff1f;又是如何拉取的&#xff1f;消息发送消息存储消息拉取 Ⅴ …

为什么FPGA是战略芯片?

FPGA&#xff08;Field Programmable Gate Array&#xff09;是在PAL&#xff08;可编程阵列逻辑&#xff09;、GAL&#xff08;通用阵列逻辑&#xff09;等可编程器件的基础上进一步发展的产物&#xff0c;它是作为一种半定制电路而出现的&#xff0c;既解决了定制电路的不足&…

STM32-02-STM32基础知识

文章目录 STM32基础知识1. STM32F103系统架构2. STM32寻址范围3. 存储器映射4. 寄存器映射 STM32基础知识 1. STM32F103系统架构 STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片&#xff0c;而Cortex M内核使用的是ARM v7-M架构&#xff0c;是为了替代…

14:00面试,14:08就出来了,问的问题有点变态。。。。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

React antd如何实现<Upload>组件上传附件再次上传已清除附件缓存问题

最近遇到一个React上传组件的问题&#xff0c;即上传附件成功后&#xff0c;文件展示处仍然还有之前上传附件的缓存信息&#xff0c;需要解决的问题是&#xff0c;要把上一次上传的附件缓存在上传成功或者取消后&#xff0c;可以进行清除 经过一顿试错&#xff0c;终于解决了这…

搭建个人智能家居 开篇(搭建Home Assistant)

搭建个人智能家居 开篇&#xff08;搭建Home Assistant&#xff09; 前言Home Assistant搭建Home AssistantUbuntu系统搭建Windows系统搭建VM安装方法VirtualBox安装方法&#xff1a; 配置Home Assistant控制页面 前言 随着科技的进步、发展&#xff0c;物联网给我们的生活带来…

企业计算机服务器中了360勒索病毒如何解密,勒索病毒解密数据恢复

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但网络安全一直存在&#xff0c;网络勒索病毒的加密与攻击技术也在不断增加。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了360勒索病毒攻击&…

(十五)Flask覆写wsgi_app函数实现自定义中间件

中间件 一、剖析&#xff1a; 在前面讲session部分提到过&#xff1a;请求一进来&#xff0c;Flask会自动调用应用程序对象【Flask(__name__)】的__call__方法&#xff0c;这个方法负责处理请求并返回响应&#xff08;其实如下图&#xff1a;其内部就是wsgi_app方法&#xff…

【抄作业】ImportError :cannot import name xxxxxx ,原博主Activewaste

前情介绍 网上关于这种问题的解决方案一大堆&#xff0c;但是绝大多数都是不适用&#xff0c;或者说解决不了问题&#xff0c;我根据别人所遇到的和我自己遇到的&#xff0c;对这个问题整理了一下&#xff0c;希望能解决这个问题。 问题分析 一、缺少这个module或者func或者p…

【C++】C++中的String类详解及模拟实现示例

文章目录 string类简介string类的基本用法string类的常用方法string类的优势 string类的模拟实现存储结构头文件string.h源文件string.cpp源文件test.cpp string类简介 string类简介在C编程中&#xff0c;字符串是一种非常常见的数据类型&#xff0c;用于存储文本信息。C标准库…

我的网站服务器被入侵了该怎么办?

最近有用户咨询到德迅云安全&#xff0c;说自己再用的网站服务器遇到了入侵情况&#xff0c;询问该怎么处理入侵问题&#xff0c;有什么安全方案可以解决服务器被入侵的问题。下面&#xff0c;我们就来简单讲下服务器遇到入侵了&#xff0c;该从哪方面入手处理&#xff0c;在预…

全球化需要先搬离中国?中国公司出海不应失去“模式自信”

中国企业出海近期热闹非凡&#xff0c;其中以短剧为代表的文化内容产业和跨境电商产业都吸引了大量关注。例如亚马逊在12月12日公布一组最新数据&#xff0c;亚马逊过去一年销售额超过1000万美金的中国卖家数量&#xff0c;同比增长接近30%。中国跨境电商平台在刚刚过去的“黑五…

机器学习算法应用场景与评价指标

一、应用场景 机器学习的算法选择大部分依赖于具体的问题类型和数据特征。下面是一些典型的场景以及对应的常用算法&#xff1a; 1.二元分类问题 当你的目标变量只有两个类别时&#xff0c;如垃圾邮件过滤&#xff08;垃圾邮件/非垃圾邮件&#xff09;、患者疾病诊断&#x…

医院污水处理设备远程监控超标报警解决方案

行业背景 近年来&#xff0c;我国医疗机构建设得到了巨大的发展。根据《2022年我国卫生健康事业发展统计公报》&#xff0c;2022年末&#xff0c;全国医疗卫生机构总数达1032918个。截至2022年10月&#xff0c;根据全国排污许可证管理信息平台&#xff0c;共有 13316家医院核发…

UE引擎 LandscapeGrass 实现机制分析(UE5.2)

前言 随着电脑和手机硬件性能越来越高&#xff0c;游戏越来越追求大世界&#xff0c;而大世界非常核心的一环是植被&#xff0c;目前UE5引擎提供给植被生成的主流两种方式为 手刷植被和LandscapeGrass(WeightMap程序化植被)。当然UE5.3推出新一代PCGFramework 节点程序化生成框…

Halcon reduce_domain和scale_image的作用

在Halcon中&#xff0c;reduce_domain是用于缩小图像域&#xff08;Image Domain&#xff09;的操作。 它的作用是通过指定一个感兴趣区域&#xff08;ROI&#xff0c;Region of Interest&#xff09;&#xff0c;将图像数据限制在该区域内&#xff0c;从而实现对图像进行裁剪…

领导力的3个常见误区,你可能中了其中之一

什么是领导力&#xff1f; 领导力是组织和团队成功的关键。在一个不断变化的商业环境中&#xff0c;理解领导力的本质至关重要。这篇文章将揭示有关领导力的三个常见误解&#xff0c;帮助读者更清晰地认识领导者的角色。 关于领导力的常见误解 人们对领导力的理解经常受到错…