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的更多相关文章

  1. 北京师范大学第十六届程序设计竞赛决赛 F 汤圆防漏理论

    链接:https://www.nowcoder.com/acm/contest/117/F来源:牛客网 汤圆防漏理论 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  2. Java并发(6)- CountDownLatch、Semaphore与AQS

    引言 上一篇文章中详细分析了基于AQS的ReentrantLock原理,ReentrantLock通过AQS中的state变量0和1之间的转换代表了独占锁.那么可以思考一下,当state变量大于1时代 ...

  3. F. 汤圆防漏理论

    ghc很喜欢吃汤圆,但是汤圆很容易被粘(zhān)漏. 根据多年吃汤圆经验,ghc总结出了一套汤圆防漏理论: 互相接触的汤圆容易粘(zhān)在一起,并且接触面积不同,粘(zhān)在一起的粘(niá ...

  4. C#基础---Attribute(标签) 和 reflect(反射) 应用二

    以前我有写过一篇有关,打标签和反射的应用,主要用于类中字段的验证.下面是连接 C#基础---Attribute(标签) 和 reflect(反射) 应用. 这个项目迭代发现公司项目里面发现老代码对业务 ...

  5. 【转】物业管理与移动互联网科技|微信公众平台,物业app,物业O2O

    [导语]当下,物业管理行业正在接受新科技浪潮的冲击和洗礼,业界企业纷纷探索物业服务的新发展模式.云服务.微社区.微信公众平台.app等,这些本来陌生的词汇在物业管理行业变得耳熟能详.在借助科技手段拓展 ...

  6. hanlp在Python环境中的安装失败后的解决方法

    Hanlp是由一系列模型与算法组成的javag工具包,目标是普及自然语言处理再生环境中的应用.有很多人在安装hanlp的时候会遇到安装失败的情况,下面就是某大神的分享的在python环境中安装失败的解 ...

  7. IO流详解

    目录 IO流 IO流概述及其分类 IO概念 流按流向分为两种: 流按操作类型分为两种: 常用的IO流类 字节流的抽象父类: 字符流的抽象父类: InputStream & FileInputS ...

  8. 2018BNU校赛总决赛

    题解是qls的题解我就懒得写了23333 A塞特斯玛斯塔 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld ...

  9. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

随机推荐

  1. hdu5893 List wants to travel(树链剖分+线段树)

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...

  2. Codeforces Round #697 (Div. 3) D. Cleaning the Phone (思维,前缀和)

    题意:你的手机有\(n\)个app,每个app的大小为\(a_i\),现在你的手机空间快满了,你需要删掉总共至少\(m\)体积的app,每个app在你心中的珍惜值是\(b_i\),\(b_i\)的取值 ...

  3. [Angular] 删除旧版本,升级安装最新版本

    目录 删除旧版本 清除未卸载干净的angular-cli缓存 对于Linux 对于Windows 安装最新版本 查看安装版本 创建新项目 删除旧版本 npm uninstall -g angular- ...

  4. windows 命令行 cmd 控制exe程序输入输出并比较

    参考 https://www.cnblogs.com/zccz14/p/4588634.html 例子: 对exe输入输出 使用fc比较不同

  5. Leetcode 30 串联所有单词的子串 滑动窗口+map

    见注释.滑动窗口还是好用. class Solution { public: vector<int> findSubstring(string s, vector<string> ...

  6. 查找命令中grep,find,which和whereis的使用及区别

    在linux系统中,许多时候需要查找某些文件或者字符,如果用ls, cd 等基础命令就显得很无力了,那么Linux提供了grep,find,which 三种查找命令,在这里我记录一下: 一.grep命 ...

  7. C++中main函数的返回值一定要是int

    因为大学上课时候,经常是在主函数中做处理,直接用cout语句输出到显示设备,所以一直在用void main(). 直到后面具体编程的时候,才发现void main()这种用法是按 C89(C语言的早期 ...

  8. 深入剖析JavaScript中的对象与原始值之间的转换机制

    我们都知道原始值之间是可以互相转换的,但是如果对象转原始值呢? 所有的对象在布尔上下文(context)中均为 true .所以对于对象,不存在 to-boolean 转换, 只有字符串和数值转换. ...

  9. 015.NET5_MVC_Razor局部视图

    局部视图 1. 可以增加代码的重用性 如何定义? 1.添加一cshtml文件 2. 在页面中调用局部视图:@html.Partial("局部视图的名称") 问题:局部视图中不能访问 ...

  10. 2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?

    任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...