同步工具类 CountDownLatch 和 CyclicBarrier
在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解
线程的
wait() notify() notifyall()
方法线程异步返回
Future
ThreadLocal
类线程池
ThreadPoolExecutor
同步工具类
CountDownLatch
,CyclicBarrier
,Semaphore
,Phaser
,Exchanger
估计上面每一个对于 2~3 年的 java 同学来说都是恶梦,比较难以理解,本文简单说下 CountDownLatch
和 CyclicBarrier
CountDownLatch
CountDownLatch
一般在执行时间较长的可分解的任务中比较常用,算是同步工具类中最容易理解的一个。
示例一:
一个简单的例子:有一个 100 万的 excel 数据导出,需要从数据库中查出数据,并封装成 excel 数据然后输出到前端。
稍微分析可以知道这个操作肯定会很费时间,它的瓶颈出在查询数据库数据和写 excel 上,如果我每 10 万数据一页读数据库并写 excel 成一个文件,最后把所有的 excel 使用 zip 打包,使用多线程,由于读数据库并不会加锁,性能将会有一个量级的提升(有实践过),这时会有一个问题,我启动多个线程后,主线程如何才能知道所有的线程都完成了呢,只有在所有线程都完成了后,才能对所有 excel 文件进行打包,这时可以用 CountDownLatch
,伪代码如下:
// Excel 线程
class ExcelThread extend Thread{
private CountDownLatch countDownLatch;
public ExcelThread(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
}
public void run(){
try{
// do query db & write excel
}finally{
countDownLatch.countDown();
}
}
}
public static void main(){
//假定生成 3 个 excel
CountDownLatch countdownlatch = new CountDownLatch(3);
foreach :
new ExcelThread(countdownlatch).start();
countDownLatch.await();
// do zip compress & down
}
示例二:
如果用过 IDM 下载工具,看它的下载进度一定知道它是多线程下载的,自动分成了多段,其实用 java 的 RandomAccessFile
配合 CountDownlatch
一样可以做到多线程下载,可以实例化多个 RandomAccessFile
然后让其指向文件不同的文件位置,然后向里面填充数据即可,主线程在分线程全部完成后检验文件完整性。
当然 IDM 做得更好,它会其它线程都完成了,如果某一段还卡着的话,继续分隔,同样多线程下载,当然速度就快了。
示例三:
对于CountDownLatch,其他线程为游戏玩家,比如王者荣耀,主线程为控制游戏开始的线程。在所有的玩家都准备好之前,主线程是处于等待状态的,也就是游戏不能开始。当所有的玩家准备好之后,下一步的动作实施者为主线程,即开始游戏。
CyclicBarrier
相比如 CountDownLatch
是在主线程等待,CyclicBarrier
是子线程相互等待,而主线程早就已经结束了,并且在子线程相互等待的同时,可以附带一个 CountDownLatch
类似功能的线程,等所有子线程都完成了再操作,并且 CyclicBarrier
是可重用的,说这么多,看它的使用方式就知道什么意思了。
五人六足之类的游戏不知道读者玩过没,每个玩家是一个线程,必须互相等待对方准备好才可以进行下一步操作,其中也可以来一位指挥员他等到所有同学完成准备后下发指令,左脚,右脚。。。伪代码如下:
// 游戏玩家线程
class GamePerson extend Thread{
private CyclicBarrier cyclicBarrier;
public GamePerson(CyclicBarrier cyclicBarrier){
this.cyclicBarrier = cyclicBarrier;
}
public void run(){
// 走下一步的准备阶段
prepareNextStep();
cyclicBarrier.await();
// 走下一步
nextStep();
}
}
// 主线程
public static void main(){
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
//构建 5 个游戏玩家
foreach:
new GamePerson(cyclicBarrier);
// 游戏开始,并开始计时
startGame();beginCountTime();
foreach:gamepersons
gameperson.start();
}
// 主线程,添加指挥员
class Leader extend Thread{
public void run(){
System.out.println(“开始走”);
}
}
// 主线程
public static void main(){
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Leader());
//构建 5 个游戏玩家
foreach:
new GamePerson(cyclicBarrier);
// 游戏开始,并开始计时
startGame();beginCountTime();
foreach:gamepersons
gameperson.start();
}
// 前面的例子只能跨一步,如果需要重用 CyclicBarrier 需要把主线程也当做同步对象,代码如下
public static void main(){
CyclicBarrier cyclicBarrier = new CyclicBarrier(6);
//构建 5 个游戏玩家
foreach:
new GamePerson(cyclicBarrier);
// 游戏开始,并开始计时
startGame();beginCountTime();
//假设让它们走 10 步
for(int i=0;i<10;i++){
cyclicBarrier.reset();
foreach:gamepersons
gameperson.start();
cyclicBarrier.await();
}
}
一点小推广
创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。
Excel 通用导入导出,支持 Excel 公式
博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi
使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-maven
同步工具类 CountDownLatch 和 CyclicBarrier的更多相关文章
- JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...
- JAVA并发工具类---------------(CountDownLatch和CyclicBarrier)
CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进 ...
- 并发是个什么鬼之同步工具类CountDownLatch
扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...
- 同步工具类—— CountDownLatch
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CountDownLatch简介 CountDownLa ...
- 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)
在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
- Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ...
- 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier
目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...
- 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger
1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ...
随机推荐
- vue+uwsgi+nginx部署luffty项目
在部署项目之前本人已经将前端代码和后端代码发布在了一个网站上,大家可自行下载,当然如果有Xftp工具也可以直接从本地导入. django代码 https://files.cnblogs.com/fil ...
- AssetBundle异步加载被中断的问题
刘 刘泰言创建于 1 年前 在使用异步接口 yield return AssetBundle.ASyncLoad的时候,难免会想到:这个异步处理完之前如何Cancel掉这个任务?也就是一个AssetB ...
- Java 计算n对应的二进制位上有几个1,分别在什么位置
Java计算n的二进制位上有几个1,分别在什么位置 public List<Integer> getBinOneCount(int n){ List<Integer> ...
- 解决本地无法访问vm虚拟机上centos7服务器中已配置好的hugo站点的问题
一.配置VM网络连接 打开vm,找到"编辑",打开"虚拟网络编辑器" 选中下面截图中的上方为类型为"NAT模式"那一栏,然后点击下方的&qu ...
- QA:无重复字符的最长子串
无重复字符的最长字串 leetcode地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-character ...
- Pandas 分组聚合
# 导入相关库 import numpy as np import pandas as pd 创建数据 index = pd.Index(data=["Tom", "Bo ...
- CSPS模拟 87
考场上思考量不可减少 否则分数秒变弟弟,考后秒变弱智 T1 二分答案.打的稍恶心 T2 线段树维护“如果我在这个点开枪,前方点的贡献有多大” 想明白了就很好理解了 另外已经飞过去八千里的鸟还输入进来干 ...
- 无聊的 邮递员 插头dp
邮递员想知道,如果他每天都用不同路线走过10×20个点阵邮筒,他必须活过多少个世纪才能走遍所有方案? 7:00 改完T1,开始肝插头dp 7:10 放弃,颓博客 7:20 学习插头dp 7:21 放弃 ...
- NOIP模拟 13
我终于又厚颜无耻地赖着没走 ...... T1 矩阵游戏 用了30hmin找规律,然后发现貌似具有交换律,然后发现貌似有通项公式,然后发现貌似每次操作对通项的影响是相同的,然后发现貌似跟N没啥关系.. ...
- 用python实现对元素的长截图
一.目标 浏览网页的时候,看见哪个元素,就能截取哪个元素当图片,不管那个元素有多长 二.所用工具和第三方库 python ,PIL,selenium pycharm 三.代码部分 长截图整体思路: 1 ...