使用Java线程同步工具类CountDownLatch
java.util.concurrent.CountDownLatch是Java并发并发编程中的线程同步工具类,基于AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)实现。
CountDownLatch工具类主要应用在如下场景:等待一组线程执行完毕后继续执行后续操作。
应用举例:模拟使用多个线程同时调用多个RPC方法,然后汇总所有线程获取到的返回结果。
// 模拟同时调用多个接口获取数据,汇总后返回给客户端
private static void summary() throws InterruptedException {
// 模拟需要调用10个方法才能获取到数据
int count = 10;
// 每个方法的返回结果都保存到列表中
List<Object> result = new ArrayList<>(count);
// 使用CountDownLatch来控制10个方法都执行完毕之后再汇总数据
CountDownLatch latch = new CountDownLatch(count);
for (int i = 0; i < count; i++) {
int index = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep((new Random().nextInt(10)) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result.add(String.format("result%s", index));
// 每个线程在执行完毕之后都必须将计数器减1
latch.countDown();
System.out.println(String.format("线程%s结束了", Thread.currentThread().getName()));
}
}).start();
}
// 等待前面的所有方法都请求完毕并得到返回结果之后再进行处理
System.out.println("等待所有方法执行完毕...");
latch.await();
// 从结果列表中获取返回信息
System.out.println(String.format("最终的汇总结果:%s", result));
}
输出:
等待所有方法执行完毕...
线程Thread-9结束了
线程Thread-3结束了
线程Thread-6结束了
线程Thread-5结束了
线程Thread-7结束了
线程Thread-4结束了
线程Thread-0结束了
线程Thread-2结束了
线程Thread-8结束了
线程Thread-1结束了
最终的汇总结果:[result4, result0, result9, result8, result2, result5, result3, result6]
完毕!
使用Java线程同步工具类CountDownLatch的更多相关文章
- Java核心知识点学习----线程同步工具类,CyclicBarrier学习
线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...
- 同步工具类 CountDownLatch 和 CyclicBarrier
在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异 ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- java 利用同步工具类控制线程
前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...
- Java多线程同步工具类之CountDownLatch
在过去我们实现多线程同步的代码中,往往使用join().wait().notiyAll()等线程间通信的方式,随着JUC包的不断的完善,java为我们提供了丰富同步工具类,官方也鼓励我们使用工具类来实 ...
- java线程并发工具类CyclicBarrier、CountDownLatch及Semaphore
一.CyclicBarrier (原文链接:http://www.studyshare.cn/blog-front/blog/index ) 1.定义 CyclicBarrier是线程并发工具类之 ...
- 并发是个什么鬼之同步工具类CountDownLatch
扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...
- JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...
- 同步工具类—— CountDownLatch
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CountDownLatch简介 CountDownLa ...
- Java并发——同步工具类
CountDownLatch 同步倒数计数器 CountDownLatch是一个同步倒数计数器.CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatch对象 ...
随机推荐
- [转帖]《Linux性能优化实战》笔记(七)—— CPU瓶颈快速分析及性能优化思路
相当于是前面篇章的小结 一. CPU 性能指标 常见指标包括: 平均负载 CPU 使用率(user.iowait.system.软硬中断等) 进程上下文切换(自愿.非自愿) CPU 缓存的命中率 CP ...
- [转帖]Kafka 核心技术与实战学习笔记(六)kafka线上集群部署方案
一.操作系统-Linux Kafka是JVM系的大数据框架 kafka由Scala语言和Java语言编写而成,编译之后的源代码就是普通的".class"文件 使用Linux kaf ...
- Java火焰图简单学习
前言 立的flags倒了太多次 自己还是太菜了.. 课题太大, 自己简单总结一下. 要是自己总结错了. 就不收费, 错就错了 !-_-! 第一步准备环境 一定要设置对java的HOME以及PATH路径 ...
- sed 删除包含某字符的一行 给包含某字符的一行添加 逗号的简单方法
今天处理环境折腾死了 方法: #给包含 configdata 的一行 添加 逗号结尾 find . -name "*.json" |xargs sed -i '/configdat ...
- 如何将axios封装成一个插件
01==>重新写axios的插件 在src下创建一个插件文件为plugins 在创建一个http.js文件 根据官方插件 重新写axios的插件 http.js文件如下 import axios ...
- Go实现网络代理
使用 Go 语言开发网络代理服务可以通过以下步骤完成.这里,我们将使用 golang.org/x/net/proxy 包来创建一个简单的 SOCKS5 代理服务作为示例. 步骤 1. 安装 golan ...
- 收藏-即时通讯(IM)开源项目OpenIM-功能手册
OpenIM简介 OpenIM是由IM技术专家打造的开源即时通讯组件,也是目前最受欢迎的开源IM项目之一,目前github star近万.开发者通过集成OpenIM组件,并私有化部署服务端,可以将即时 ...
- linxu下面的绝对路径和相对路径
绝对路径和相对路径 前言 相对路径与绝对路径 绝对路径 相对路径 目录的相关操作 绝对路径和相对路径 前言 学习linux,对于里面的路径肯定要很清楚.做下总结吧. 相对路径与绝对路径 绝对路径 路径 ...
- 14.4 Socket 双向数据通信
所谓双向数据传输指的是客户端与服务端之间可以无差异的实现数据交互,此类功能实现的核心原理是通过创建CreateThread()函数多线程分别接收和发送数据包,这样一旦套接字被建立则两者都可以异步发送消 ...
- 5.1 C/C++ 使用文件与指针
C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...