Java中CountDownLatch进行多线程同步详解

CountDownLatch介绍
在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法:
1、synchronized关键字进行同步。
2、Lock锁接口及其实现类ReentrantLock、ReadWriteLock锁实现同步。
3、信号量Semaphore实现同步。
其中,synchronized关键字和Lock锁解决的是多个线程对同一资源的并发访问问题。信号量Semaphore解决的是多副本资源的共享访问问题。
今天,来学习一下Java中的另外一个多线程同步辅助类:CountDownLatch。官方文档对CountDownLatch的解释是:在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。也就是说,CountDownLatch控制某个或者多个线程,让它们等待多个线程完成某项任务后,再启动。CountDownLatch主要是用来同步多个任务的执行,区别于其他的synchronized关键字,锁,信号量是用来同步共享资源的。
CountDownLatch实现原理简介:
CountDownLatch内部维护一个计数器,计数器的值为待完成的任务数N,需要等待这N个任务完成的线程调用
CountDownLatch的await()方法使自己进入休眠等待状态。
当某一个任务线程完成某一个任务后调用CountDownLatch的countDown()方法来表示自己的任务已完成,此时CountDownLatch的计数器值减1,当所有的任务完成式,计数器的值为0。当计数器值为0时,CountDownLatch将唤醒所有因await()方法进入休眠的线程。
CountDownLatch的使用:
CountDownLatch的使用主要有3点:
1、CountDownLatch的声明及初始化,在初始化时需要指定等待完成的任务数。
2、某一个任务完成时调用CountDownLatch的countDown()方法,向CountDownLatch报告自己的任务已经完成,
3、需要等待任务完成的线程调用CountDownLatch的await()方法,调用后该线程将进入休眠,并在所有任务数完成后CountDownLatch的计数器值为0时,因await()方法进行休眠的线程将被唤醒。
在此本人在Java 7并发编程实战手册该书中的CountDownLatch使用示例的基础上做了部分改进,来演示CountDownLatch的使用详情:
模拟10个参会者和一个主持人参加的一个会以,每个参会者及主持人需要等待其他的参会者均到场签到之后,才能开始会以并发言。为此,先创建一个会以管理的类VideoConference,其提供一个arrive()方法供参会者调用来进行签到。会议管理的拥有者是主持人,其等待每个参会者的签到:
public class VideoConference implements Runnable{
private final CountDownLatch countDownLatch;
private int number;
public VideoConference(int number) {
this.number = number;
this.countDownLatch = new CountDownLatch(number);//使用Number初始化其内部的计数器,当初始化完成后,不能再次初始化
}
public void arrive(String name){
//每个需要同步的任务,在任务完成时,需要调用该方法
countDownLatch.countDown();//countDownLatch内部的计数器减1
System.out.print("arrive:"+name+"\n");
try{
countDownLatch.await();//await方法是线程进入休眠,当countDownLatch计数器为0时,将被唤醒
//线程被唤醒,在这里可以执行一系列任务
System.out.print("name:"+name + " say:let's start..." +"\n");
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void run(){
System.out.print("has arrive:"+(number-countDownLatch.getCount())+"\n");
try{
countDownLatch.await();//await方法是线程进入休眠,当countDownLatch计数器为0时,将被唤醒
//线程被唤醒,在这里可以执行一系列任务
System.out.print("all arrived:"+(number-countDownLatch.getCount())+"\n");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
创建一个参会者类Participant:
public class Participant implements Runnable{
private VideoConference videoConference;
private String name;
public Participant(String name, VideoConference videoConference) {
this.name = name;
this.videoConference = videoConference;
}
public void run(){
try {
//do something
Thread.sleep(50);
//
videoConference.arrive(name);
}catch (InterruptedException e){
e.printStackTrace();
}
}
public static void main(String[] args){
VideoConference videoConference = new VideoConference(10);
Thread videoThread = new Thread(videoConference);
videoThread.start();
for(int i=0; i<10; i++){
Thread thread = new Thread(new Participant("participant:"+i,videoConference));
thread.start();
}
}
}
Participant类中的main函数首先创建了一个需要10个参会者参加的一个会议,之后,创建了10个参会者并逐个签到,在10个参会者都签到之后,每个参会者及主持人将被"唤醒"并发言。
总结:
CountDownLatch类解决的是多线程间的同步等待、任务协调问题,应用在如在启动某个程序的主功能前,需要前置完成配置环境检查、网络检查等多个子任务等类似的场景。在Java中,除了使用CountDownLatch来实现多线程间的同步等待以外,还可以使用栅栏技术CyclicBarrier来实现多线程间的同步等待、任务协调。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java中CountDownLatch进行多线程同步
# Java中CountDownLatch详解
# java多线程CountDownLatch与线程池ThreadPoolExecutor/Execut
# Java countDownLatch如何实现多线程任务阻塞等待
# 如何使用CountDownLatch同步java多线程
# java使用CountDownLatch等待多线程全部执行完成
# JAVA多线程CountDownLatch使用详解
# Java中多线程同步类 CountDownLatch
# 详解Java多线程编程中CountDownLatch阻塞线程的方法
# Java多线程编程之CountDownLatch同步工具使用实例
# Java多线程之同步工具类CountDownLatch
# 参会
# 多个
# 多线程
# 的是
# 信号量
# 将被
# 值为
# 自己的
# 会以
# 在这里
# 来实现
# 创建一个
# 几个
# 完成后
# 还可以
# 在此
# 是用来
# 其他的
# 并在
# 希望能
相关文章:
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
建站主机选虚拟主机还是云服务器更好?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何在香港服务器上快速搭建免备案网站?
建站之星后台管理系统如何操作?
一键网站制作软件,义乌购一件代发流程?
建站之星如何开启自定义404页面避免用户流失?
如何在腾讯云服务器上快速搭建个人网站?
焦点电影公司作品,电影焦点结局是什么?
如何高效配置IIS服务器搭建网站?
如何通过wdcp面板快速创建网站?
如何快速配置高效服务器建站软件?
5种Android数据存储方式汇总
建站VPS选购需注意哪些关键参数?
,购物网站怎么盈利呢?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
宝塔建站助手安装配置与建站模板使用全流程解析
高端网站建设与定制开发一站式解决方案 中企动力
代购小票制作网站有哪些,购物小票的简要说明?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
南平网站制作公司,2025年南平市事业单位报名时间?
小程序网站制作需要准备什么资料,如何制作小程序?
建站之星如何助力网站排名飙升?揭秘高效技巧
C#如何使用XPathNavigator高效查询XML
平台云上自助建站如何快速打造专业网站?
如何用花生壳三步快速搭建专属网站?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
建站之星如何快速解决建站难题?
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
沈阳制作网站公司排名,沈阳装饰协会官方网站?
自助网站制作软件,个人如何自助建网站?
建站之星多图banner生成与模板自定义指南
如何快速上传建站程序避免常见错误?
如何通过商城自助建站源码实现零基础高效建站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何快速搭建高效服务器建站系统?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
制作旅游网站html,怎样注册旅游网站?
广德云建站网站建设方案与建站流程优化指南
在线制作视频的网站有哪些,电脑如何制作视频短片?
非常酷的网站设计制作软件,酷培ai教育官方网站?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
如何选择PHP开源工具快速搭建网站?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
如何选择最佳自助建站系统?快速指南解析优劣
*请认真填写需求信息,我们会在24小时内与您取得联系。