在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解

  • 线程的 wait() notify() notifyall() 方法

  • 线程异步返回 Future

  • ThreadLocal

  • 线程池 ThreadPoolExecutor

  • 同步工具类 CountDownLatch,CyclicBarrier,Semaphore,Phaser,Exchanger

估计上面每一个对于 2~3 年的 java 同学来说都是恶梦,比较难以理解,本文简单说下 CountDownLatchCyclicBarrier

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

  1. JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...

  2. JAVA并发工具类---------------(CountDownLatch和CyclicBarrier)

    CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进 ...

  3. 并发是个什么鬼之同步工具类CountDownLatch

    扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...

  4. 同步工具类—— CountDownLatch

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CountDownLatch简介 CountDownLa ...

  5. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

  6. 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore

    前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...

  7. Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)

    在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ...

  8. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

  9. 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger

    1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ...

随机推荐

  1. docker入门级详解

    Docker 1 docker安装 yum install docker [root@topcheer ~]# systemctl start docker [root@topcheer ~]# mk ...

  2. 设计模式C++描述----13.代理(Proxy)模式

    一. 举例说明 我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示. 这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模 ...

  3. 如何理解swift中的delegate

    Delegation翻译为代理或者委托,是一种设计模式.顾名思义,使class或struct能够将某些职责移交给其他类型的实例. 该设计模式通过定义一个封装(包含)delegate的protocol( ...

  4. (转载)学校搭建使用nginx同时编译rtmp-module进行直播的技术文档

    原文地址:学校搭建使用 nginx 同时编译 rtmp-module 进行直播的技术文档 转载自我的大佬同学 MetalkgLZH.学校有几次需要全校观看网络直播的情况,但是学校的带宽不允许所有的班一 ...

  5. 《Effective Java》 读书笔记(五)使用依赖注入取代原本的资源依赖

    相信接触过Spring的同学,对于依赖注入并不陌生. 刚开始在听说这个名字的时候,一直不明白到底什么叫依赖注入,后来才发现,依赖注入一直都存在我们日常代码中,只是我们没有刻意的把它提出来,然后再取这样 ...

  6. 【XSY2344】K-th String

    Description Alice有 n(n≤26) 张牌,牌上分别标有前 n 个英文小写字母.例如,如果 n=3 ,则Alice有3张牌,分别标有"a", "b&quo ...

  7. 网络安全-主动信息收集篇第二章-二层网络扫描之arping

    arping二层网络发现 介绍工具:arping arping主要查看IP的MAC地址 缺点:工具本身只能ping一个IP地址,不能ping一个IP段.但是可以通过脚本将整个网络中的IP进行扫描. 脚 ...

  8. 【转载】InstantRun 原理——深度剖析 AndroidStudio 2.0

    一.前言 Android Studio 2.0开始支持 Instant Run 特性, 使得在开发过程中能快速将代码变化更新到设备上.之前,更新代码之后需要先编译一个完整的新Apk,卸载设备上已安装的 ...

  9. 大数据之路week01--自学之集合_2(Iterator迭代器)

    选代器:是遍历集合的一种方式.迭代器是依赖于集合而存在的.我有一个集合: Collection c = new ArrayList();我们给集合中添加元素: c. add("hello' ...

  10. [网络]HTTP

    HTTP HTTP 简介 HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本 ...