概述

CountDownLatch其实就是一个计数器,用来同步一个或多个任务,强制任务按步骤执行,多用来协调多线程。也就是一个任务想要执行,必须要等其他任务执行完后才能执行。
CountDownLatch需要设置任务初始值,也就是需要执行的任务需要分几步执行,初始值就设为几,当计数值不为0的时候,任何一个对象调用wait()都将被阻塞,每一个步骤执行完毕后,调用countDown()计数都会减一。
调用countDown()的任务在调用时没有被阻塞,只有调用wait()才会被阻塞,一直到计数值为0。
该思想并非只在并发中使用,实际开发中很多场景也会使用相似的方法。

使用

方法解读

CountDownLatch非常简单,只有几个方法。

  • await(), 等待计数器的值为0,若为0就返回,如果不为0就阻塞。
  • await(long timeout, TimeUnit unit),在指定时间内等待计数器的值为0,若为0,则返回true,若不为0,则返回false。
  • countDown(),计数减1,若减1之前为1,则置为0,且唤醒所有等待的线程;若减1之前为0,则啥也不做。
  • getCount(),获取当前计数的值。

使用

  1. 创建线程。
    产品经理:
public class ProductManager extends Thread {private CountDownLatch countDown;public ProductManager(CountDownLatch countDown) {this.countDown = countDown;}@Overridepublic void run() {if(countDown.getCount() != 4){try {countDown.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("俺是产品经理,俺是提需求的");countDown.countDown();}
}

UI设计:

public class UI extends Thread {private CountDownLatch countDown;public UI(CountDownLatch countDown) {this.countDown = countDown;}@Overridepublic void run() {if(countDown.getCount() != 3){try {countDown.await(1000, TimeUnit.MILLISECONDS);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("俺是设计,俺是设计界面的");countDown.countDown();}
}

开发:

public class Developer extends Thread {private CountDownLatch countDown;public Developer(CountDownLatch countDown) {this.countDown = countDown;}@Overridepublic void run() {if(countDown.getCount() != 2){try {countDown.await(2000, TimeUnit.MILLISECONDS);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("俺是开发,俺是干活的");countDown.countDown();}
}

测试:

public class Test extends Thread {private CountDownLatch countDown;public Test(CountDownLatch countDown) {this.countDown = countDown;}@Overridepublic void run() {if(countDown.getCount() != 1){try {countDown.await(3000, TimeUnit.MILLISECONDS);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("俺是测试,俺是保证产品质量的");countDown.countDown();}
}
  1. 按指定步骤执行。
    public static void main(String[] args) {CountDownLatch countDownLatch = new CountDownLatch(4);// UI设计UI ui = new UI(countDownLatch);ui.start();// 产品经理ProductManager productManager = new ProductManager(countDownLatch);productManager.start();// 开发Developer developer = new Developer(countDownLatch);developer.start();// 测试Test test = new Test(countDownLatch);test.start();//try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("产品可以上线了");}
  1. 结果。
俺是产品经理,俺是提需求的
俺是设计,俺是设计界面的
俺是开发,俺是干活的
俺是测试,俺是保证产品质量的
产品可以上线了

总结

CountDownLatch强调是其他任务执行完后,再执行指定任务,其他任务的执行顺序无法保证,当然可以多用几个CountDownLatch,也可以使用join()。
join可以保证线程按顺序执行,即使线程睡眠。

      try {productManager.start();productManager.join();ui.start();ui.join();developer.start();developer.join();test.start();test.join();} catch (InterruptedException e) {e.printStackTrace();}

执行结果是一样的。
CountDownLatch中线程睡眠,执行顺序就不一样了。
ProductManager 睡眠1000ms。

public class ProductManager extends Thread {private CountDownLatch countDown;public ProductManager(CountDownLatch countDown) {this.countDown = countDown;}@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("俺是产品经理,俺是提需求的");countDown.countDown();}
}

Developer睡眠3000ms。
执行:

        CountDownLatch countDownLatch = new CountDownLatch(4);// UI设计UI ui = new UI(countDownLatch);// 产品经理ProductManager productManager = new ProductManager(countDownLatch);// 开发Developer developer = new Developer(countDownLatch);// 测试Test test = new Test(countDownLatch);productManager.start();ui.start();developer.start();test.start();try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("产品可以上线了");

结果:

俺是设计,俺是设计界面的
俺是测试,俺是保证产品质量的
俺是产品经理,俺是提需求的
俺是开发,俺是干活的
产品可以上线了

CountDownLatch只能是只触发一次的事件。若是需要多次触发,就需要使用CyclicBarrier。

Java随笔-CountDownLatch相关推荐

  1. java随笔三,真正的class大总结

    java随笔三:class 一.对象与对象引用 class A{} A pa = new A(); 差不多就是A *pa = new A();显然new的是对象,pa是引用(Java毙了指针,把他换个 ...

  2. Java的CountDownLatch和CyclicBarrier的理解和区别

    CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...

  3. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...

  4. java的CountDownLatch使用

    基本使用 import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch;p ...

  5. 同步机制之--java之CountDownLatch闭锁

    CountDownLatch闭锁 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.CountDown ...

  6. JAVA多线程-CountDownLatch计数器

    一.概述 CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程执行完操作之后再继续执行.通常用于控制多个线程的执行顺序. 二.基本原理 我们可以把CountDownLatch ...

  7. Java并发——CountDownLatch

    CountDownLatch CountDownLatch是Java并发中常用的一个工具类,通常称为锁存器latch,作用为同步一个或多个任务,强制等待指定任务执行完成.即多线程中控制一个或多个线程去 ...

  8. Java随笔——逻辑运算符和(|和||)之间的区别

    "&"和"&&"的区别: 使用 & 时,左边的运算无论真假,右边都进行运算: 使用 && 时,如果左边的运算为真 ...

  9. Java中CountDownLatch类

     创建CountDownLatch对象时,会传入一个count数值,该对象每次调用countDown()方法会使count -- ,就是count每次减1; 调用await()方法,程序会阻塞等待,当 ...

最新文章

  1. 语音文件转成文字怎么转
  2. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
  3. CentOS7内核升级
  4. Symbian编程总结-图形图像篇-打开非Bitmap类型的图像
  5. java 预处理语句_预处理语句PreparedStatement到底咋用啊
  6. [Redux/Mobx] 为什么redux能做到局部渲染呢?
  7. numpy方法读取加载mnist数据集
  8. Pandoc提供二进制分发包了
  9. 把所有圆圈连接起来的游戏_【实用教案】赶紧收藏!幼儿园秋季户外游戏大全、好玩易操作!...
  10. python015 Python3 函数
  11. Http协议规范及格式
  12. Python 的类的下划线命名有什么不同?
  13. [转].net中的认证(authentication)与授权(authorization)
  14. DEVC使用问题集锦
  15. 什么软件可以清除流氓软件
  16. 网络抖动多少ms算正常_如何测试网络稳定
  17. 【零基础学Python】Day10 Python解释器
  18. 遇到问题---eclipse--java--tomcat运行web项目报错Licensed to the Apache Software Foundation (ASF) under one or m
  19. 《刻意练习》读书心得 驳斥1万小时定律、有目的的练习、自我实现的预言、走出舒适区
  20. Node.js报错:UnhandledPromiseRejectionWarning: Unhandled promise rejection

热门文章

  1. 第1课:ScratchJr软件介绍
  2. 【记一次kafka报org.apache.kafka.clients.consumer.CommitFailedException异常处理】
  3. 分析B站100万+视频,发现竟然有这么多干货资源。
  4. 停车场管理系统 java_课内资源 - 基于JAVA的停车场管理系统
  5. dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
  6. 串行传输和并行传输有什么区别?
  7. ubuntu下如何控制风扇速度?
  8. 读书百客:《感遇·兰叶春葳蕤》赏析
  9. 药店app的布局html,药店详情页.html
  10. 淘域网域名交易平台推已备案未注册域名服务