全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java中CountDownLatch进行多线程同步详解及实例代码

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  # 参会  # 多个  # 多线程  # 的是  # 信号量  # 将被  # 值为  # 自己的  # 会以  # 在这里  # 来实现  # 创建一个  # 几个  # 完成后  # 还可以  # 在此  # 是用来  # 其他的  # 并在  # 希望能 


相关文章: 如何选择高效便捷的WAP商城建站系统?  b2c电商网站制作流程,b2c水平综合的电商平台?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  建站之星如何助力企业快速打造五合一网站?  建站主机如何选?性能与价格怎样平衡?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何选择域名并搭建高效网站?  网站制作需要会哪些技术,建立一个网站要花费多少?  如何通过服务器快速搭建网站?完整步骤解析  详解jQuery停止动画——stop()方法的使用  七夕网站制作视频,七夕大促活动怎么报名?  广州营销型建站服务商推荐:技术优势与SEO优化解析  独立制作一个网站多少钱,建立网站需要花多少钱?  建站之星伪静态规则如何正确配置?  Swift开发中switch语句值绑定模式  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  在线制作视频网站免费,都有哪些好的动漫网站?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  个人摄影网站制作流程,摄影爱好者都去什么网站?  家庭服务器如何搭建个人网站?  如何设计高效校园网站?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  宁波自助建站系统如何快速打造专业企业网站?  内网网站制作软件,内网的网站如何发布到外网?  建站之星×万网:智能建站系统+自助建站平台一键生成  专业商城网站制作公司有哪些,pi商城官网是哪个?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  网站制作难吗安全吗,做一个网站需要多久时间?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  如何用美橙互联一键搭建多站合一网站?  如何在腾讯云服务器快速搭建个人网站?  如何选择高效响应式自助建站源码系统?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  建站之星后台密码如何安全设置与找回?  黑客入侵网站服务器的常见手法有哪些?  建站之星安装步骤有哪些常见问题?  营销式网站制作方案,销售哪个网站招聘效果最好?  ,交易猫的商品怎么发布到网站上去?  建站之星各版本价格是多少?  制作证书网站有哪些,全国城建培训中心证书查询官网?  高防服务器租用首荐平台,企业级优惠套餐快速部署  电商网站制作公司有哪些,1688网是什么意思?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  如何制作网站标识牌,动态网站如何制作(教程)? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。