Java随笔-CountDownLatch
概述
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(),获取当前计数的值。
使用
- 创建线程。
产品经理:
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();}
}
- 按指定步骤执行。
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("产品可以上线了");}
- 结果。
俺是产品经理,俺是提需求的
俺是设计,俺是设计界面的
俺是开发,俺是干活的
俺是测试,俺是保证产品质量的
产品可以上线了
总结
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相关推荐
- java随笔三,真正的class大总结
java随笔三:class 一.对象与对象引用 class A{} A pa = new A(); 差不多就是A *pa = new A();显然new的是对象,pa是引用(Java毙了指针,把他换个 ...
- Java的CountDownLatch和CyclicBarrier的理解和区别
CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...
- 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...
- java的CountDownLatch使用
基本使用 import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch;p ...
- 同步机制之--java之CountDownLatch闭锁
CountDownLatch闭锁 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.CountDown ...
- JAVA多线程-CountDownLatch计数器
一.概述 CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程执行完操作之后再继续执行.通常用于控制多个线程的执行顺序. 二.基本原理 我们可以把CountDownLatch ...
- Java并发——CountDownLatch
CountDownLatch CountDownLatch是Java并发中常用的一个工具类,通常称为锁存器latch,作用为同步一个或多个任务,强制等待指定任务执行完成.即多线程中控制一个或多个线程去 ...
- Java随笔——逻辑运算符和(|和||)之间的区别
"&"和"&&"的区别: 使用 & 时,左边的运算无论真假,右边都进行运算: 使用 && 时,如果左边的运算为真 ...
- Java中CountDownLatch类
创建CountDownLatch对象时,会传入一个count数值,该对象每次调用countDown()方法会使count -- ,就是count每次减1; 调用await()方法,程序会阻塞等待,当 ...
最新文章
- 语音文件转成文字怎么转
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
- CentOS7内核升级
- Symbian编程总结-图形图像篇-打开非Bitmap类型的图像
- java 预处理语句_预处理语句PreparedStatement到底咋用啊
- [Redux/Mobx] 为什么redux能做到局部渲染呢?
- numpy方法读取加载mnist数据集
- Pandoc提供二进制分发包了
- 把所有圆圈连接起来的游戏_【实用教案】赶紧收藏!幼儿园秋季户外游戏大全、好玩易操作!...
- python015 Python3 函数
- Http协议规范及格式
- Python 的类的下划线命名有什么不同?
- [转].net中的认证(authentication)与授权(authorization)
- DEVC使用问题集锦
- 什么软件可以清除流氓软件
- 网络抖动多少ms算正常_如何测试网络稳定
- 【零基础学Python】Day10 Python解释器
- 遇到问题---eclipse--java--tomcat运行web项目报错Licensed to the Apache Software Foundation (ASF) under one or m
- 《刻意练习》读书心得 驳斥1万小时定律、有目的的练习、自我实现的预言、走出舒适区
- Node.js报错:UnhandledPromiseRejectionWarning: Unhandled promise rejection
热门文章
- 第1课:ScratchJr软件介绍
- 【记一次kafka报org.apache.kafka.clients.consumer.CommitFailedException异常处理】
- 分析B站100万+视频,发现竟然有这么多干货资源。
- 停车场管理系统 java_课内资源 - 基于JAVA的停车场管理系统
- dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
- 串行传输和并行传输有什么区别?
- ubuntu下如何控制风扇速度?
- 读书百客:《感遇·兰叶春葳蕤》赏析
- 药店app的布局html,药店详情页.html
- 淘域网域名交易平台推已备案未注册域名服务