CountDownLatch应用举例

定义

CountDownLatch是juc下的一个多线程锁,下面是jdk对它的定义

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

翻译如下

一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

可以简单地理解为倒计次数锁,只有计数为零时,才能执行之后的代码

关键api

  1. 构造方法
public CountDownLatch(int count)
  1. 倒计数。每执行一次这个方法,计数就减少一次
public void countDown()
  1. 等待。阻塞方法,如果倒计次数没有清空,则会一直阻塞,后面的代码则无法执行
public void await() throws InterruptedException
public boolean await(long timeout, TimeUnit unit)throws InterruptedException
  1. 获取当前计数
public long getCount()

应用场景

有一个物业经理,派出手下11个员工去收取物业费,每个员工收费结束交给经理,经理计算手中的总额,大于等于100元,则把交给上级。最后的员工到达后,不论多少,经理都将手中的钱交给上级

EMPLOYEE_COUNT :员工数量
totalAmount :经理手中的金额
THRESHOLD_AMOUNT:门槛金额,当到达门槛金额时,要执行上交操作,totalAmount 清零
feeQueue :使用BlockingQueue阻塞队列用于存放收取的物业费

代码如下

private static final int EMPLOYEE_COUNT = 11;
private static final int THRESHOLD_AMOUNT = 100;
private static BlockingQueue<Integer> feeQueue = new ArrayBlockingQueue<>(EMPLOYEE_COUNT);
private static int totalAmount = 0;public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(EMPLOYEE_COUNT + 1);CountDownLatch countDownLatch = new CountDownLatch(EMPLOYEE_COUNT);// 启动经理线程executorService.execute(() -> {try {while (countDownLatch.getCount() > 0 || !feeQueue.isEmpty()) {Integer amount = feeQueue.poll();if (amount != null) {totalAmount += amount;System.out.println("经理收到了 " + amount + " 元,总金额:" + totalAmount);if (totalAmount >= THRESHOLD_AMOUNT) {System.out.println("经理将 " + totalAmount + " 元交给上级");totalAmount = 0;}}}} catch (Exception e) {Thread.currentThread().interrupt();}});// 启动员工线程for (int i = 1; i <= EMPLOYEE_COUNT; i++) {final int employeeId = i;executorService.execute(() -> {int amount = (int) (Math.random() * 100) + 1; // 模拟收取随机金额System.out.println("员工 " + employeeId + " 收取了 " + amount + " 元");try {feeQueue.put(amount);} catch (InterruptedException e) {Thread.currentThread().interrupt();}countDownLatch.countDown();});}// 关闭线程池executorService.shutdown();try {countDownLatch.await(); // 等待所有员工线程完成} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 最后处理剩余金额if (totalAmount > 0) {System.out.println("最后的员工到达后,经理将剩余的 " + totalAmount + " 元交给上级");}
}

输出结果如下
可以看到经理每收取100元就上交一次,最后的员工到达后,经理将剩余的钱上交了,符合预期

员工 5 收取了 45 元
员工 9 收取了 47 元
员工 11 收取了 24 元
员工 4 收取了 56 元
员工 3 收取了 68 元
员工 7 收取了 11 元
员工 1 收取了 99 元
员工 8 收取了 76 元
员工 10 收取了 30 元
员工 2 收取了 10 元
员工 6 收取了 39 元
最后的员工到达后,经理将剩余的 47 元交给上级
经理收到了 47 元,总金额:47
经理收到了 68 元,总金额:115
经理将 115 元交给上级
经理收到了 45 元,总金额:45
经理收到了 11 元,总金额:56
经理收到了 24 元,总金额:80
经理收到了 99 元,总金额:179
经理将 179 元交给上级
经理收到了 56 元,总金额:56
经理收到了 76 元,总金额:132
经理将 132 元交给上级
经理收到了 30 元,总金额:30
经理收到了 10 元,总金额:40
经理收到了 39 元,总金额:79

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

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

相关文章

ADC(二):外部触发

有关ADC的基础知识请参考标准库入门教程 ADC&#xff08;二&#xff09;&#xff1a;外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…

磁盘分区格式

MBR和GPT ‌磁盘分区形式主要有两种&#xff1a;MBR和GPT。‌‌ MBR&#xff08;Master Boot Record&#xff09; MBR是一种较旧的分区形式&#xff0c;首次引入于1983年的IBM PC DOS 2.0。它位于驱动器的第一个扇区&#xff0c;包含460字节的引导代码、64字节的磁盘分区表和…

几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks

几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost&#xff1a;(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO&#xff1a;中药配伍的复杂性1.QUBO 的介入&#xff1a;寻找最佳药材组合 二、难题&#xff1a;QUBO矩阵未知的问题1.为什么这么难&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择&#xff1a; 三、压缩感知算法(C…

【连续学习之SSL算法】2018年论文Selfless sequential learning

1 介绍 年份&#xff1a;2018 期刊&#xff1a; arXiv preprint Aljundi R, Rohrbach M, Tuytelaars T. Selfless sequential learning[J]. arXiv preprint arXiv:1806.05421, 2018. 本文提出了一种名为SLNID&#xff08;Sparse coding through Local Neural Inhibition and…

关于SNAT、DNAT及浮动地址

SNAT、DNAT SNAT、DNAT就是实现代理的功能。 SNAT 类似于客户端代理&#xff1a;内网主机通过共享公网 IP 地址访问外部服务。DNAT 类似于服务端代理&#xff1a;外部请求通过公网 IP 转发到内网主机上的服务。 没有大网地址的内部主机想要作为客户端访问外部网络&#xff08;主…

结构方程模型【SEM】:嵌套分层数据及数据分组分析

结构方程模型&#xff08;System of Equations Model&#xff0c;简称SEM&#xff09;&#xff0c;在生态学和环境科学中通常指的是一组描述生态系统中能量、物质和信息流动的数学方程。这些方程可以是确定性的&#xff0c;也可以是随机的&#xff0c;它们共同构成了一个模型&a…

hot100_56. 合并区间

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。 请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。数据结构 二维链表存储每个区间 方法 先对每个区间的…

Python大数据:基于Python的王者荣耀战队数据分析系统的设计与实现

系统展示 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与MYSQL技术搭建了一个王者荣耀战队的数据分析系统。对用户提出的功能进行合理分析&#xff0c;然后搭建开发平台以及配置计算机软硬件&#xff1b;通过对数据流图以及系统结构的设计&#xff0c;创建相应的数据…

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的&#xff0c;在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号&#xff0c;到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了

深入理解与优化Java二维数组:从定义到性能提升的全面指南

1. 定义和初始化二维数组 在Java中&#xff0c;二维数组可以看作是数组的数组。你可以将它想象成一个矩阵或表格&#xff0c;每个元素是一个数组。 1.1 定义二维数组 二维数组的定义语法如下&#xff1a; datatype[][] arrayName;datatype 是数组元素的数据类型。arrayName…

day26 文件io

函数接口 1 .open和close 文件描述符&#xff1a;系统为用open打开的文件分配的标识符 非负的整形数据 0-1023 最小未被使用原则 使用完时及时释放&#xff0c;避免文件描述符溢出 文件描述溢出就是文件使用完没有及时关闭文件 int open(const char *pathname, int flags); /…

Java Stream流详解——串行版

Stream流——串行版 ​ Stream流是java8引入的特性&#xff0c;极大的方便了我们对于程序内数据的操作&#xff0c;提高了性能。通过函数式编程解决复杂问题。 1.BaseStream<T,S extense BaseStream<T,S>> ​ 他是流处理的基石概念&#xff0c;重点不在于这个接…

el-backtop(返回顶部)

案例&#xff1a; <el-backtop target".app-main"><svg-icon icon-class"backtop" size"24px" /></el-backtop>

探秘“香水的 ChatGPT”:AI 开启嗅觉奇幻之旅!

你没有看错&#xff0c;AI也能闻到味道了&#xff01;这是一家名为Osmo公司公布的信息&#xff0c;他们成功创造出了由AI生成的李子味道&#xff0c;快跟着小编一探究竟吧~ 【图片来源于网络&#xff0c;侵删】 Osmo公司的这项技术&#xff0c;通过分析香味的化学成分和人类嗅…

Vue3入门(9)

1. 【 replace属性】 作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式。 浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff1a; - push是追加历史记录&#xff08;默认值&#xff09;。 - replace是替换当前记录。 . 开启replace模式&#xff…

第十九章 C++ 日期 时间

C 日期 & 时间 C 标准库没有提供所谓的日期类型。C 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构&#xff0c;需要在 C 程序中引用 <ctime> 头文件。 有四个与时间相关的类型&#xff1a;clock_t、time_t、size_t 和 tm。类型…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天&#xff0c;电子配件行业作为科技创新的前沿阵地&#xff0c;正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备&#xff0c;各种新型电子配件层出不穷&#xff0c;极大地丰富了人们的生活。然而&#xff0c;随着产品种类的增多和功能的复杂化…

强化学习方法分类详解

强化学习方法分类详解 引言 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过智能体与环境互动来学习如何做出最佳决策的方法。根据不同的优化中心、策略特性、环境模型、奖励函数、动作空间类型以及行为策略和目标策略的一致性&#xff0c;RL可以分为…

RockyLinux介绍及初始化

文章目录 一、背景二、下载 RockyLinux9 镜像三、环境初始化四、安装 Docker 环境 一、背景 这里讲一个小故事&#xff1a; 我们都知道Linux 内核是由芬兰计算机科学家林纳斯托瓦兹 (Linus Torvalds) 于 1991 年首次开发的&#xff0c;随后有一个非常重要的公司RetHat成立&am…