正月十五吃汤圆CountDownLatch
CountDownLatch实际应用
今天是正月十五,给大家拜个晚年啦!
元宵节是中国传统节日,吃汤圆不能少啊,今天我们统计下“叫练”吃汤圆时间,并用代码模拟下叫练吃汤圆!其中用到我们的CountDownLatch了!

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; /**
* @author :jiaolian
* @date :Created in 2021-02-26 14:49
* @description:CountDownLatch模拟统计吃汤圆花费时间
* @modified By:
* 公众号:叫练
*/
public class CountDownLatchSpeedTimeTest { public static void main(String[] args) throws InterruptedException {
//定义一个CountDownLatch计数器
CountDownLatch countDownLatch = new CountDownLatch(1);
long start = System.currentTimeMillis();
//创建一个“叫练”线程吃汤圆
new Thread(()->{
int time = (int)(Math.random()*10) + 1;
//模拟统计吃汤圆花费
try {
TimeUnit.SECONDS.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"吃完汤圆");
//计数器递减
countDownLatch.countDown();
},"叫练线程").start();
//主线程阻塞等待"叫练线程"执行完毕
countDownLatch.await();
System.out.println("主线程:吃汤圆共花费"+(System.currentTimeMillis()-start)+"毫秒");
}
}
如上代码所示:一共有两个线程,主线程和自定义“叫练”线程,在主线程中定义一个CountDownLatch计数器,初始值为1,创建一个“叫练”线程用随机数模拟吃汤圆时间,主线程调用countDownLatch.await()阻塞等待"叫练线程"执行完毕,最后主线程统计“叫练”线程执行吃完汤圆所花费时间。执行可能结果如下图所示。

上面代码我们用到了CountDownLatch,他实际上是一个计数器,主线程调用await()方法会让主线程阻塞直到计数器值为0会返回,上面案例CountDownLatch初始化值为1,在“叫练”线程吃完汤圆会执行countDownLatch.countDown(),计数器会减1,此时CountDownLatch等于0,所以主线程继续执行最后一句代码统计“叫练”线程执行时长。所以在时间顺序上两个线程看起来是这样的。如下图所示。 如果不调用countDownLatch.await(),主线程不会等待,程序会立刻返回,在实际项目场景中,一般CountDownLatch可以来统计多线程执行时长来测试多线程执行性能。另外在CountDownLatch没有出现时,我们用join方法替代。

和Join比较
上述代码CountDownLatch完全可以用join替代,在“叫练”线程中先返回一个Thread,然后用Thread调用join方法,也可以达到上面的效果。
但是还有一点需要注意的是,如果上述代码换成线程池,join就不好用了,join本身底层是调用wait方法来实现阻塞的,需要直接与线程相关联,而线程池对线程进行了封装处理,线程池线程复用,线程内置,无法通过线程对外提供join接口,所以join使用上就有局限性了,而CountDownLatch应运而生。相对于Join来说,CountDownLatch不依赖线程,能和线程池结合起来用,相对灵活,在实际场景中推荐使用。
总结
今天我们介绍了CountDownLatch,整理出来希望能对你有帮助,写的比不全,同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路,我是叫练【公众号】,微信号【jiaolian123abc】边叫边练。
正月十五吃汤圆CountDownLatch的更多相关文章
- 北京师范大学第十六届程序设计竞赛决赛 F 汤圆防漏理论
链接:https://www.nowcoder.com/acm/contest/117/F来源:牛客网 汤圆防漏理论 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...
- Java并发(6)- CountDownLatch、Semaphore与AQS
引言 上一篇文章中详细分析了基于AQS的ReentrantLock原理,ReentrantLock通过AQS中的state变量0和1之间的转换代表了独占锁.那么可以思考一下,当state变量大于1时代 ...
- F. 汤圆防漏理论
ghc很喜欢吃汤圆,但是汤圆很容易被粘(zhān)漏. 根据多年吃汤圆经验,ghc总结出了一套汤圆防漏理论: 互相接触的汤圆容易粘(zhān)在一起,并且接触面积不同,粘(zhān)在一起的粘(niá ...
- C#基础---Attribute(标签) 和 reflect(反射) 应用二
以前我有写过一篇有关,打标签和反射的应用,主要用于类中字段的验证.下面是连接 C#基础---Attribute(标签) 和 reflect(反射) 应用. 这个项目迭代发现公司项目里面发现老代码对业务 ...
- 【转】物业管理与移动互联网科技|微信公众平台,物业app,物业O2O
[导语]当下,物业管理行业正在接受新科技浪潮的冲击和洗礼,业界企业纷纷探索物业服务的新发展模式.云服务.微社区.微信公众平台.app等,这些本来陌生的词汇在物业管理行业变得耳熟能详.在借助科技手段拓展 ...
- hanlp在Python环境中的安装失败后的解决方法
Hanlp是由一系列模型与算法组成的javag工具包,目标是普及自然语言处理再生环境中的应用.有很多人在安装hanlp的时候会遇到安装失败的情况,下面就是某大神的分享的在python环境中安装失败的解 ...
- IO流详解
目录 IO流 IO流概述及其分类 IO概念 流按流向分为两种: 流按操作类型分为两种: 常用的IO流类 字节流的抽象父类: 字符流的抽象父类: InputStream & FileInputS ...
- 2018BNU校赛总决赛
题解是qls的题解我就懒得写了23333 A塞特斯玛斯塔 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld ...
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...
随机推荐
- Flink-v1.12官方网站翻译-P025-Queryable State Beta
可查询的状态 注意:可查询状态的客户端API目前处于不断发展的状态,对所提供接口的稳定性不做保证.在即将到来的Flink版本中,客户端的API很可能会有突破性的变化. 简而言之,该功能将Flink的托 ...
- Scala数据结构(数组,Map和Tuple)
package com.zy import scala.collection.mutable import scala.collection.mutable.ArrayBuffer object te ...
- Codeforces Global Round 8 D. AND, OR and square sum(位运算)
题目链接:https://codeforces.com/contest/1368/problem/D 题意 给出一个大小为 $n$ 的数组 $a$,每次可以选两个下标不同的元素,一个赋为二者相与的值, ...
- hdu 2089不要62 (数位dp)
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...
- Codeforces Round #498 (Div. 3) D. Two Strings Swaps (思维)
题意:给你两个长度相同的字符串\(a\)和\(b\),你可以将相同位置上的\(a\)和\(b\)的字符交换,也可以将\(a\)或\(b\)中某个位置和对应的回文位置上的字符交换,这些操作是不统计的,你 ...
- 【POJ 1148】Utopia Divided
Utopia Divided 题目链接:POJ 1148 题目大意 在一个坐标系中,一个点一开始在原点,然后被要求每次走到一个规定的象限内. 你有一些互不相同的数,每次你可以选每选过的两个,正负性可以 ...
- 【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务
问题描述 创建新的Service Fabric集群,可以通过门户,Powershell命令,或者是ARM模板.但是通过门户和PowerShell命令时,创建的SF集群都会自动新建一个虚拟网络而无法使用 ...
- Gitlab日常维护(三)之Gitlab的备份、迁移、升级
一.Gitlab的备份 使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份 [root@gitlab ~]# gitla ...
- 设计模式(二十三)——策略模式(Arrays源码分析)
1 编写鸭子项目,具体要求如下: 1) 有各种鸭子(比如 野鸭.北京鸭.水鸭等, 鸭子有各种行为,比如 叫.飞行等) 2) 显示鸭子的信息 2 传统方案解决鸭子问题的分析和代码实现 1) 传统的设计方 ...
- 操作系统 part4
1.操作系统的启动 CPU加电后,执行BIOS(基本IO处理系统).BIOS会进行硬件的自检和初始化,然后把加载程序(BootLoader)从磁盘上的引导扇区中加载到指定位置0x7c00.然后控制权交 ...