正月十五吃汤圆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个人 ...
随机推荐
- FunnyXEN
For any positive integer n, we define function F(n) and XEN(n).For a collection S(n)={1,2,...,2n}, w ...
- 2019牛客暑期多校训练营(第八场)A-All-one Matrices(单调栈+思维)
>传送门< 题意:给你一个01矩阵,求出所有不可扩大的全为1的矩阵的个数 思路:比赛的时候想到了用单调栈,但是也只是想到了,并不知道怎么用,其实和之前求二维01矩阵中全为1的矩阵最大面积非 ...
- [POJ1985] Cow Marathon 「树的直径」
>传送门< 题意:求树的直径 思路:就是道模板题,两遍dfs就求出来了 Code #include <cstdio> #include <iostream> #in ...
- c++中几种swap
在c与c++中,有多种办法可以通过函数交换传入的两数的值,但有容易有一些问题产生,因而本文将几种交换方式及容易出错的点进行了分类. 1.传引用这是c++中最常见方式如下: int swap1 (int ...
- Codeforces Round #673 (Div. 2) B. Two Arrays(数学)
题目链接:https://codeforces.com/contest/1417/problem/B 题意 定义 $f(a)$ 为数组 $a$ 中满足: $i < j$ $a_i + a_j = ...
- HDU6311 Cover【欧拉路径 | 回路】
HDU6311 Cover 题意: 给出\(N\)个点的简单无向图,不一定联通,现在要用最少的路径去覆盖所有边,并且每条边只被覆盖一次,问最少路径覆盖数和各条路径 \(N\le 10^5\) 题解: ...
- python爬虫模板 - 最好大学网
import requests from bs4 import BeautifulSoup import bs4 def get_html_text(url): try: #kv = {'user-a ...
- POJ - 1743 Musical Theme (后缀数组)
题目链接:POJ - 1743 (不可重叠最长子串) 题意:有N(1<=N<=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的子串,它需要 ...
- Codeforces Round #550 (Div. 3) D. Equalize Them All (贪心,模拟)
题意:有一组数,可以选择某个数\(a_i\)相邻的一个数\(a_j\),然后可以让\(a_i\)加上或者减去\(|a_i-a_j|\),问最少操作多少次使得数组中所有数相同. 题解:不难发现,每次操作 ...
- Codeforces #637 div2 B. Nastya and Door
题意:给你一个数组a,定义:若a[i]>a[i]&&a[i]>a[i-1],则a[i]为峰值,求长度为k的区间内峰值最多能为多少,并输出这个区间的左端点(区间需要将峰的左边 ...