JAVA语言之CountDownLatch与join的区别
小标 2019-01-09 来源 : 阅读 1047 评论 0

摘要:本文主要向大家介绍了JAVA语言之CountDownLatch与join的区别,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之CountDownLatch与join的区别,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


我们来看一下这个应用场景:假设现在公司有三个员工A,B,C,他们要开会。但是A需要等B,C准备好之后再才能开始,B,C需要同时准备。我们先用join模拟上面的场景。  


Employee.java:

 

  public class Employee extends Thread{

 

  private String employeeName;

 

  private long time;

 

  public Employee(String employeeName,long time){

 

  this.employeeName = employeeName;

 

  this.time = time;

 

  }

 

 

  public void run() {

 

  try {

 

  System.out.println(employeeName+ "开始准备");

 

  Thread.sleep(time);

 

  System.out.println(employeeName+" 准备完成");

 

  } catch (Exception e) {

 

  e.printStackTrace();

 

  }

 

  }

 

  }

 

  JoinTest.java:

 

  public class JoinTest {

 

  public static void main(String[] args) throws InterruptedException {

 

  Employee a = new Employee("A", 3000);

 

  Employee b = new Employee("B", 3000);

 

  Employee c = new Employee("C", 4000);

 

  b.start();

 

  c.start();

 

  b.join();

 

  c.join();

 

  System.out.println("B,C准备完成");

 

  a.start();

 

  }

 

  }

   


最后输出结果如下:


C开始准备


B开始准备


B 准备完成


C 准备完成


B,C准备完成


A开始准备


A 准备完成


可以看到,A总是在B,C准备完成之后才开始执行的。


CountDownLatch中我们主要用到两个方法一个是await()方法,调用这个方法的线程会被阻塞,另外一个是countDown()方法,调用这个方法会使计数器减一,当计数器的值为0时,因调用await()方法被阻塞的线程会被唤醒,继续执行。


接下来,我们用CountDownLatch来模拟一下。  Em


ployee.java:

 

  public class Employee extends Thread{

 

  private String employeeName;

 

  private long time;

 

  private CountDownLatch countDownLatch;

 

  public Employee(String employeeName,long time, CountDownLatch countDownLatch){

 

  this.employeeName = employeeName;

 

  this.time = time;

 

  this.countDownLatch = countDownLatch;

 

  }

 

 

  public void run() {

 

  try {

 

  System.out.println(employeeName+ "开始准备");

 

  Thread.sleep(time);

 

  System.out.println(employeeName+" 准备完成");

 

  countDownLatch.countDown();

 

  } catch (Exception e) {

 

  e.printStackTrace();

 

  }

 

  }

 

  }

 

  CountDownLatchTest.java:

 

  public class CountDownLatchTest {

 

  public static void main(String[] args) throws InterruptedException {

 

  CountDownLatch countDownLatch = new CountDownLatch(2);

 

  Employee a = new Employee("A", 3000,countDownLatch);

 

  Employee b = new Employee("B", 3000,countDownLatch);

 

  Employee c = new Employee("C", 4000,countDownLatch);

 

  b.start();

 

  c.start();

 

  countDownLatch.await();

 

  System.out.println("B,C准备完成");

 

  a.start();

 

  }

 

  }

   


输出结果如下:


B开始准备


C开始准备


B 准备完成


C 准备完成


B,C准备完成


A开始准备


A 准备完成


上面可以看到,CountDownLatch与join都能够模拟上述的场景,那么他们有什么不同呢?这时候我们试想另外一个场景就能看到他们的区别了。


假设A,B,C的工作都分为两个阶段,A只需要等待B,C各自完成他们工作的第一个阶段就可以执行了。


我们来修改一下Employee类: 


public class Employee extends Thread{

 

 private String employeeName;

 

 private long time;

 

 private CountDownLatch countDownLatch;

 

 public Employee(String employeeName,long time, CountDownLatch countDownLatch){

 

 this.employeeName = employeeName;

 

 this.time = time;

 

 this.countDownLatch = countDownLatch;

 

 }

 

 

 public void run() {

 

 try {

 

 System.out.println(employeeName+ " 第一阶段开始准备");

 

 Thread.sleep(time);

 

 System.out.println(employeeName+" 第一阶段准备完成");

 

 countDownLatch.countDown();

 

 System.out.println(employeeName+ " 第二阶段开始准备");

 

 Thread.sleep(time);

 

 System.out.println(employeeName+" 第二阶段准备完成");

 

 } catch (Exception e) {

 

 e.printStackTrace();

 

 }

 

 }

 

 }

   


CountDownLatchTest类不需要做修改,输出结果入下:


B 第一阶段开始准备


C 第一阶段开始准备


B 第一阶段准备完成


B 第二阶段开始准备


C 第一阶段准备完成


C 第二阶段开始准备


B,C第一阶段准备完成


A 第一阶段开始准备


B 第二阶段准备完成


A 第一阶段准备完成


A 第二阶段开始准备


C 第二阶段准备完成


A 第二阶段准备完成


从结果可以看出,A在B,C第一阶段准备完成的时候就开始执行了,不需要等到第二阶段准备完成。这种场景下,用join是没法实现的。


总结:调用join方法需要等待thread执行完毕才能继续向下执行,而CountDownLatch只需要检查计数器的值为零就可以继续向下执行,相比之下,CountDownLatch更加灵活一些,可以实现一些更加复杂的业务场景。


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程