当前位置: 首页 > 编程日记 > 正文

Java常用多线程辅助工具---countdownLatch

为什么80%的码农都做不了架构师?>>> hot3.png

前言

上一篇博文说到semaphore,一个加强版的synchronized,该多线程辅助工具适用于控制对资源操作或者访问的场景。现在有一张场景是,需要等各个线程都都执行完了再进行下一步的操作,比如需要批量对上传的文件进行压缩,上传十个文件,压缩成一个包,这时候,就需要等上传完十个以后再进行压缩操作,类似于阻塞,concurrent包提供了countdownLatch辅助工具。

countdownLatch,中文翻译是门闩的意思,类似一个计数器,控制线程执行任务的时机,以组团的方式一起执行任务。该类会判断count计数不为0时,则呈wait状态,也就是屏障处等待,如果为0则继续执行。

入门

开启两个线程进行计数,同时主线程在wait状态,最后实现组团执行后续任务:

    @Testpublic void testCountDownLatch() throws InterruptedException {CountDownLatch latch = new CountDownLatch(2);for (int i = 0; i < 2; i++) {new Thread(() -> {log.info("开始count,当前是线程:{},时间是:{}",Thread.currentThread().getName(),LocalDateTime.now());try {Thread.currentThread().sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();}).start();}log.info("等待计数器count,现在是:{}", LocalDateTime.now());latch.await();log.info("结束计数器count,现在是:{}", LocalDateTime.now());}

运行结果是:

f205197e1adde0085180d37266a42fc3102.jpg

比较复杂的使用案例

模拟运动员从到场准备到开跑的过程,具体代码如下:

@Test
public void testCountDownLatch2() throws InterruptedException {CountDownLatch comingTag = new CountDownLatch(5);CountDownLatch waitTag = new CountDownLatch(1);CountDownLatch waitRunTag = new CountDownLatch(5);CountDownLatch beginTag = new CountDownLatch(1);CountDownLatch endTag = new CountDownLatch(5);for (int i = 0; i < 5; i++) {new Thread(() -> {try {Thread.sleep(5000);log.info("{}号运动员已经入场,time:{}", Thread.currentThread().getName(), LocalDateTime.now());comingTag.countDown();waitTag.await();log.info("{}号运动员开始准备,time:{}", Thread.currentThread().getName(), LocalDateTime.now());Thread.sleep(3000);waitRunTag.countDown();log.info("{}号运动员准备结束,time:{}", Thread.currentThread().getName(), LocalDateTime.now());beginTag.await();log.info("{}号运动员开跑,time:{}", Thread.currentThread().getName(), LocalDateTime.now());Thread.sleep(2000);log.info("{}号运动员跑完了,time:{}", Thread.currentThread().getName(), LocalDateTime.now());endTag.countDown();} catch (InterruptedException e) {e.printStackTrace();}}).start();}comingTag.await();log.info("运动员全部入场,time:{}", LocalDateTime.now());log.info("预备口令,time:{}", LocalDateTime.now());Thread.sleep(2000);waitTag.countDown();waitRunTag.await();log.info("远动员准备完毕,time:{}", LocalDateTime.now());log.info("发令枪响,time:{}", LocalDateTime.now());Thread.sleep(2000);beginTag.countDown();endTag.await();log.info("全部运动员到达终点,time:{}", LocalDateTime.now());
}

运行结果是:

转载于:https://my.oschina.net/u/3470849/blog/1824247

相关文章:

听说,英特尔要对外开放 x86 授权?

整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;同为主流芯片架构&#xff0c;相较于可申请授权的 ARM 和开源的 RISC-V&#xff0c;x86 一直以来都保持着“高高在上”的立场——唯有英特尔和 AMD 拥有 x86 授权。但目前看来&#xff0c;x86 的“高冷…

Linux下gedit显示行号

Gedit 编辑->视图

关于String数组的用法

android ContextWrapper.getResources(ContextWrapper.java:89) getResources()报错原因是在OnCreate方法外 无法完成Context的初始化 正确做法&#xff1a; String[] names;names new String[6];names[0] getResources().getString(R.string.a);names[1] getResources().g…

使用RabbitMQ做数据接收和处理时,自动关闭

场景&#xff1a;N个客户端向MQ里发送数据&#xff1b;服务器上有另一个控制台程序(假设叫ServerClient)来处理这里数据&#xff08;往数据库保存&#xff09;。方向为Client * n→MQSERVER→ServerClient 问题&#xff1a;ServerClient自动关闭&#xff0c;没有错误日志&#…

在 Python 中妙用短路机制

作者 | 费弗里来源 | Python大数据分析本期我们即将学习的是&#xff1a;Python中短路机制的妙用。不同于物理学中的「短路」&#xff08;Short circuit&#xff09;那般危险&#xff0c;Python中的短路机制非常有用&#xff0c;跟很多其他编程语言中的短路机制作用类似&#x…

《Advanced PHP Programming》读书笔记

此书无中文版&#xff0c;但是写的极好&#xff01;本来想翻译的&#xff0c;可是时间不允许了。 http://www.amazon.com/Advanced-PHP-Programming-George-Schlossnagle/dp/0672325616/refpd_rhf_dp_p_t_1约定&#xff1a;加粗字体表示章节&#xff0c;由于时间关系解释性的说…

cookie记录用户的浏览商品的路径

在电子商务的网站中&#xff0c;经常要记录用户的浏览路径&#xff0c;以判断用户到底对哪些商品感兴趣&#xff0c;或者哪些商品之间存在关联。 下面将使用cookie记录用户的浏览过的历史页面。该网站将每个页面的标题保存在该页面的$TITLE 变量中&#xff0c;用户每访问一次&a…

如何快速写一个违背双亲委托机制的classloader

很多情况下&#xff0c;不得以必须写个classloader来满足需求。例如你一个工程里你想用相同的数据库的多个版本&#xff0c;自己制定了一个jar包目录&#xff0c;没有classloader管理等等。如果是一个遵循java已经规定好的机制的classloader&#xff08;双亲委托以及加载依赖类…

让我们谈谈RAID

转自&#xff1a;http://soft.zdnet.com.cn/techupdate/2004/0330/397707.shtml 更新时间: 2004-03-30 17:14:00 作者&#xff1a; 赵效民 感觉写的很好就转来了。 RAID的种类 RAID的英文全称为Redundant Array of Inexpensive&#xff08;或Independent&#xff09; Disks&…

Ampere 携手 Rigetti 开发混合量子经典计算机

该合作旨在为价值 160 亿美元的机器学习市场提供服务&#xff0c;赋能机器学习应用的发展双方将把 Ampere Altra Max 处理器和 Rigetti 量子处理单元进行优化结合&#xff0c;为机器学习提供整合的云平台 2022 年 2 月 21 日&#xff0c;安晟培半导体科技有限公司&#xff08;A…

[C++] NULL VS nullptr

NULL VS nullptr 转载于:https://www.cnblogs.com/tianhangzhang/p/4945623.html

swift 的defer使得资源的分配和释放代码可以放到一起

只是一种语法和逻辑上的优化

烂泥:haproxy学习之手机规则匹配

2019独角兽企业重金招聘Python工程师标准>>> 本文由ilanniweb提供友情赞助&#xff0c;首发于烂泥行天下 想要获得更多的文章&#xff0c;可以关注我的微信ilanniweb。 今天我们来介绍下有关haproxy匹配手机的一些规则配置。 一、业务需要 现在根据业务的实际需要&a…

jQuery日期选择器插件date-input

官网&#xff1a;http://jonathanleighton.com/projects/date-input/下载&#xff1a; http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js http://github.com/jonleighton/date_input/raw/master/jquery.date_input.js http://github.com/jonleighton/date_inp…

厉害了,用Python绘制动态可视化图表,并保存成gif格式

作者 | 俊欣来源 | 关于数据分析与可视化最近有粉丝问道说“是不是可以将这些动态的可视化图表保存成gif图”&#xff0c;小编立马就回复了说后面会写一篇相关的文章来介绍如何进行保存gif格式的文件。那么我们就开始进入主题&#xff0c;来谈一下Python当中的gif模块。安装相关…

facade-门面模式

解决问题 客户端调用逻辑与业务代码有效隔离&#xff0c;使得客户端调用只和Facade进行交互&#xff0c;内部的调用逻辑由Facade进行实现。此模式也可以和接口化编程结合&#xff0c;进一步降低客户端与业务逻辑的耦合 应用场景 它主要应用在代码结构的设计&#xff0c;合理组织…

淘宝李晓拴:淘宝网PHP电子商务应用

源自&#xff1a;http://tech.qq.com/a/20110512/000298.htm 大家好&#xff0c;大家知道淘宝搜索是一个典型PHP架构。在座同学不知道有多少人使用过淘宝搜索可以举手示意一下&#xff1f;在开始这个话题之前我们先谈一下Polyglot&#xff0c;多语言混合编程&#xff0c;淘宝有…

玩爬虫不会登陆?这个工具拿走不谢!

作者 | 周萝卜来源 | 萝卜大杂烩在日常学习当中&#xff0c;我们或多或少都会到网上抓取一些数据&#xff0c;比如豆瓣、微博等等&#xff0c;但是这些网站在非登录的情况只能拿到部分数据&#xff0c;有很多数据都是需要登陆之后才可以获取的&#xff0c;那么模拟登陆就成为了…

Oracle分页

先看以下两条语句的执行结果&#xff1a; 语句一&#xff1a;select rownum,empno,sal from emp order by empno; ROWNUM EMPNO SAL ---------- ---------- ---------- 1 7369 800 2 7499 1600 3 7521 …

Scala类型系统——高级类类型(higher-kinded types)

高级类类型就是使用其他类型构造成为一个新的类型&#xff0c;因此也称为 类型构造器(type constructors)。它的语法和高阶函数(higher-order functions)相似&#xff0c;高阶函数就是将其它函数作为参数的函数&#xff1b;高级类类型则是将构造类类型作为参数类型。一个高级类…

android休眠唤醒驱动流程分析【转】

转自&#xff1a;http://blog.csdn.net/hanmengaidudu/article/details/11777501标准linux休眠过程&#xff1a;l power management notifiers are executed with PM_SUSPEND_PREPAREl tasks are frozenl target system sleep state is announced to the …

PHP使用curl_multi_add_handle并行处理

http://www.php.net/manual/zh/function.curl-multi-add-handle.php<?php// 创建一对cURL资源$ch1 curl_init();$ch2 curl_init();// 设置URL和相应的选项curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/");curl_setopt($ch1, CURLOPT_HEADER, 0);curl…

斯坦福团队是如何构建更好用的聊天 AI 呢?

作者&#xff1a;Standford AI译者&#xff1a;Yang来源&#xff1a;数据实战派2019 年&#xff0c;凭借着 Chirpy Cardinal 机器人&#xff0c;斯坦福首次在 Alexa Prize Socialbot Grand Challenge 3 中赢得了第二名。本文将进一步揭示 Chirpy Cardinal 开发细节&#xff0c;…

使用Linux进行缓冲区溢出实验的配置记录

在基础的软件安全实验中&#xff0c;缓冲区溢出是一个基础而又经典的问题。最基本的缓冲区溢出即通过合理的构造输入数据&#xff0c;使得输入数据量超过原始缓冲区的大小&#xff0c;从而覆盖数据输入缓冲区之外的数据&#xff0c;达到诸如修改函数返回地址等目的。但随着操作…

Javascript导出Excel的方法

<SCRIPT LANGUAGE"javascript"> function method1(tableid) {//整个表格拷贝到EXCEL中 var curTbl document.getElementById(tableid); var oXL new ActiveXObject("Excel.Application"); //创建AX对象excel var oWB oXL.Workbooks.Add(); //获取…

Top 15 不起眼却有大作用的 .NET功能集

目录1. ObsoleteAttribute2. 设置默认值属性&#xff1a; DefaultValueAttribute3. DebuggerBrowsableAttribute4. &#xff1f;&#xff1f;运算符5. Curry 及 Partial 方法6. WeakReference7. Lazy8. BigInteger9. 非官方关键字&#xff1a;__arglist __reftype __makeref __…

M2 芯片终于要来了?全线换新,性能远超M1 Max

‍‍不知不觉日历已翻至 2 月下旬&#xff0c;掐指一算&#xff0c;距离苹果一年一度春季新品发布会的召开似乎已越来越近。根据年初统计的 2022 年苹果新品预测&#xff0c;预计今年的苹果“小春晚”将在 Mac 方面有大动作。 那么&#xff0c;苹果将如何“动作”&#xff0c;又…

Python抓取新浪新闻数据(三)

非同步载入一般在XHR下查找&#xff0c;但是没有发现XHR下有相关内容。 转载于:https://blog.51cto.com/2290153/2126862

不畏浮云遮望眼--离散数学和组合数学

不畏浮云遮望眼&#xff0c;基础很重要&#xff01;离散数学是算法和数据结构的基础&#xff0c;而算法和数据结构又是什么的基础&#xff1f;不解释了。1.《离散数学及其应用》作者: (美)Kenneth H. R出版社: 机械工业出版社出版年: 2007-6页数: 804定价: 79.00元丛书: 计算机…

上班摸鱼,刚刚发现在 VScode 中可玩魂斗罗,超级玛丽

今天&#xff0c;再给大家介绍一款更加有意思的vscode插件——“小霸王”。 GitHub传送门&#xff1a;https://github.com/gamedilong/anes-repository 安装方式&#xff1a; 对于插件的安装,可以按照上图的操作流程。 1.打开VScode&#xff0c;然后点击拓展。 2.在输入框中&am…