【JUC】CountDownLatch你真的了解吗?
时间:2022-07-23
本文章向大家介绍【JUC】CountDownLatch你真的了解吗?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
在平时的开发中,我们如何让各个线程间协调工作呢? 除了我们经常使用的线程同步锁Sychronized,ReentrantLOcak的使用,还有线程自有方法,sleep,yeid的使用。哪还有那些高级的使用呢?那就是JUC包中的CountDownLatch,CyclicBarrier,Semaphore。今天我们先了解一下CountDownLatch的使用。
CountDownLatch
1. 权威指南
- 一种同步帮助,允许一个或多个线程等待,直到其他线程中执行的一组操作完成为止。 一个CountDownLatch初始化为给定数。该await方法将阻塞,直到由于该countDown()方法的调用导致当前计数达到零为止,此后所有等待线程被释放,并且随后的所有awaitreturn 调用都将立即释放 。这是一种一次性现象-无法重置计数。如果您需要用于重置计数的版本,请考虑使用CyclicBarrier。
- 类介绍
2. 代码演示
package JUC;
import lombok.Data;
import lombok.SneakyThrows;
import org.omg.PortableServer.THREAD_POLICY_ID;
import java.util.concurrent.CountDownLatch;
/**
* @authoryuanxindong
* @date: 2020/6/16 10:18 下午
*/
public class CountDownLatchDemo implements Runnable{
private static final int DownLatchCount = 3;
private int timeOut;
public CountDownLatchDemo(int timeOut){
this.timeOut = timeOut;
}
static final CountDownLatch latch = new CountDownLatch(DownLatchCount);
public static void main(String[] args) {
// 创建多个线程,且每个线程的sleep的时间是不一致的
CountDownLatchDemo countDownLatchDemo = new CountDownLatchDemo(1000);
Thread thread = new Thread(countDownLatchDemo);
CountDownLatchDemo countDownLatchDemov2 = new CountDownLatchDemo(3000);
Thread thread1 =new Thread(countDownLatchDemov2);
CountDownLatchDemo countDownLatchDemov3 = new CountDownLatchDemo(4000);
Thread thread2 =new Thread(countDownLatchDemov3);
long start = System.currentTimeMillis();
thread.start();
thread1.start();
thread2.start();
try {
System.out.println("等待"+DownLatchCount+"个子线程执行完毕...");
latch.await();
System.out.println(DownLatchCount+"个子线程已经执行完毕");
long time = System.currentTimeMillis()-start;
System.out.println("time:"+ time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@SneakyThrows
@Override
public void run() {
Thread.sleep(timeOut);
System.out.println("yuanxindongO"+Thread.currentThread().getName());
latch.countDown();
}
}
- 通过启用三个线程,然后给每个线程一个运行时间通过sleep来控制。分别是1000和3000和4000
- countDownLatch的作用是可以等待所有线程达到执行初始定义的次数,就可以释放阻塞,接着完成主线程。
- 执行结果:
总结
- 允许一个或多个线程等待某些操作完成(完美!!!!)
参考资料
- https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/CountDownLatch.html
- https://time.geekbang.org/column/article/9373
- https://www.cnblogs.com/dolphin0520/p/3920397.html
- Spark硬件配置推荐
- Spark作业调度
- 如何把Photoshop改造成远程控制工具(RAT)来利用
- Office高级威胁漏洞在野利用分析
- 10行代码告诉你,为什么说Python数据可视化是一件艺术品
- 没想到你是这样的Linux | 终端下有趣的命令合集
- PhEmail:基于Python的开源网络钓鱼测试工具
- 数据库中间件mysql-proxy细节【mysql官方的中间件】
- Office CVE-2017-8570远程代码执行漏洞复现
- Java 并发包中的读写锁及其实现分析
- 深入理解 Spring 事务原理
- Chrome开发者工具的小技巧
- Java Web中JSP中6种动作概况知识点总结——每日一语法学习
- 从Flash到Silverlight进阶教程-用代码来创建动画
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 两个CSS知识点:BFC和选择器权重
- C语言入门系列之9.预处理
- Python爬虫常见异常及解决办法
- 理解nodejs中js和c++的通信原理
- 如何使用FFmpeg将互联网直播点播平台内直播视频流转化为HLS流?
- 记一次nodejs问题排查
- 使用Go语言编译互联网视频直播点播平台EasyDSS出现ld returned 1 exit status错误
- c/c++补完计划(四): 字节对齐和虚继承
- Python 不用selenium 带你高效爬取京东商品评论
- 《闲扯Redis六》Redis五种数据类型之Hash型
- rocketmq学习2
- Python全栈(八)Flask项目实战之1.项目搭建
- 一起来读开源项目的代码-Agar.io为例
- C语言入门系列之11.文件和文件操作
- 自己动手改造 Jetpack LiveData