目录

  • 引言
  • 理论
  • 例子
  • 打赏

本人邮箱: kco1989@qq.com
欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代码已经全部托管github有需要的同学自行下载

引言

有一个同步助手,可以让一个或一些线程等待直到另外一些线程执行完一些操作.这就是CountDownLatch

理论

CountDownLatch在初始化的时候需要一个count参数.调用await()的线程会一直等待,直到其他线程调用countDown使count清空为0.通常所有等待中的线程会被释放并且后面继续调用await的线程会立即返回.这个是一次性操作,count不能被重置的.如果想要被重置的话,就可以参考(九)java多线程之CyclicBarrier

  • CountDownLatch(int count) 构造一个指定countCountDownLatch
  • await() 如果当前的count为0的话,则会立即返回,否则当前线程一直等待,直到以下情况至少发生一个
    • 其他线程调用countDown使count清空为0
    • 当前线程被其他线程中断
  • await(long timeout, TimeUnit unit) 如果当前的count为0的话,则会立即返回,否则当前线程一直等待,直到以下情况至少发生一个
    • 其他线程调用countDown使count清空为0
    • 当前线程被其他线程中断
    • 指定的时间超时
  • countDown() 如果当前的count大于0,则count减1,否则,所有等待的线程重新获得执行机会

例子

我们还是用上一篇文章旅游做例子吧.小明,小刚,小红','小丽,小黑,小白他们六个最后旅游回来时坐飞机,飞机上就有空姐啦.那么等他们六个人下飞机之后,空姐就要考试清理垃圾啦,检查设备等等,这些事情都必须飞机上的全部乘客下机之后才能做.行,按照这个场景,我们编写一下程序吧.

  • 首先,想定义一个飞机类 Airplane, 里面包含乘客下机和空姐的清理工作
public class Airplane {private CountDownLatch countDownLatch;private Random random;public Airplane(int peopleNum){countDownLatch = new CountDownLatch(peopleNum);random = new Random();}/*** 下机*/public void getOffPlane(){try {String name = Thread.currentThread().getName();Thread.sleep(random.nextInt(500));System.out.println(name + " 在飞机在休息着....");Thread.sleep(random.nextInt(500));System.out.println(name + " 下飞机了");countDownLatch.countDown();} catch (InterruptedException e) {e.printStackTrace();}}public void doWork(){try {String name = Thread.currentThread().getName();System.out.println(name + "准备做 清理 工作");countDownLatch.await();System.out.println("飞机的乘客都下机," + name + "可以开始做 清理 工作");} catch (InterruptedException e) {e.printStackTrace();}}}
  • 最后,就可以直接写测试类
public class TestMain {public static void main(String[] args) {String visitor = "明刚红丽黑白";String kongjie = "美惠花";Airplane airplane = new Airplane(visitor.length());Set<Thread> threads = new HashSet<>();for (int i = 0; i < visitor.length(); i ++){threads.add(new Thread(() -> {airplane.getOffPlane();}, "小" + visitor.charAt(i)));}for (int i = 0; i < kongjie.length(); i ++){threads.add(new Thread(() ->{airplane.doWork();}, "小" + kongjie.charAt(i) + "空姐"));}for (Thread thread : threads){thread.start();}}
}

运行一下结果:

小花空姐准备做 清理 工作
小惠空姐准备做 清理 工作
小美空姐准备做 清理 工作
小丽 在飞机在休息着....
小明 在飞机在休息着....
小白 在飞机在休息着....
小刚 在飞机在休息着....
小刚 下飞机了
小明 下飞机了
小黑 在飞机在休息着....
小丽 下飞机了
小红 在飞机在休息着....
小红 下飞机了
小白 下飞机了
小黑 下飞机了
飞机的乘客都下机,小花空姐可以开始做 清理 工作
飞机的乘客都下机,小美空姐可以开始做 清理 工作
飞机的乘客都下机,小惠空姐可以开始做 清理 工作

通过结果可以发现,空姐都是等所有的乘客下飞机之后,才做清理工作的.结果正确,无毛病.


打赏

如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)

转载于:https://www.cnblogs.com/kco1989/p/6760882.html

(十)java多线程之CountDownLatch相关推荐

  1. Java多线程之CountDownLatch用法

    Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...

  2. JAVA多线程之CountDownLatch

    前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...

  3. java多线程之CountDownLatch倒数闸门

    在多个线程进行协作时,一个常见的情景是一个线程需要等待另外的线程完成某些任务之后才能继续进行.在这种情况下,可以使用CountDownLatch类,CountDownLatch类相当于多个线程等待开启 ...

  4. 高级JAVA - 多线程之CountDownLatch

    package com.xbz.thread.juc.countDownLatch;import java.util.concurrent.CountDownLatch;/*** @title Cou ...

  5. (二十)java多线程之ScheduledThreadPoolExecutor

    本人邮箱: <kco1989@qq.com> 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.co ...

  6. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  7. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  8. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  9. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

最新文章

  1. 2.4G高频PCB天线设计
  2. ATAC-seq学习记录
  3. 时隔5年,再次接触数字图像处理
  4. Qt中应用程序的打包与发布
  5. HDU 1243 最长公共子序列 动态规划
  6. 通过Java反射来理解泛型的本质
  7. 星河经纬加入会员可靠吗_珍爱网免费相亲可靠吗?女会员处境艰难红娘为她重拾勇气...
  8. [ Problem 1 ] 数独游戏
  9. 六部工坊ros启智机器人定点导航技术_【展品抢鲜看】程天科技外骨骼机器人亮相峰会,让每个人享受机器人的服务!...
  10. 函数的参数,参数为数组
  11. 直播聊天室源码php,某网络直播聊天室源码 财经直播聊天系统
  12. 通信与信息系统专业排名全国前十的…
  13. 网课题库收录API接口以及免费网课查询API接口
  14. 上面两点下面一个三角形_用三角形知识解释生活常见应用,三角形考点合集「建议收藏」...
  15. 检测运行程序,强制电脑关机代码
  16. html 在线测试 鱼缸,新做的草缸教程,看1遍你也会做,鱼缸造景其实很简单
  17. 2021年最新AZ自动发卡网源码-全网首发
  18. vue实现PC端和移动端的界面切换
  19. 轻松搞定应用启动黑白屏
  20. 商务个人邮箱,vip邮箱哪个最好用?外贸邮箱哪个是安全邮箱?

热门文章

  1. CVPR 2021 | 大幅涨点!新型动态激活函数和轻量级网络TFNet
  2. 一切为了开放科学!Papers with Code 新增CS、物理、数学、统计学等多个学科
  3. 收藏 | LSTM模型结构的可视化
  4. ios html字符串 label,iOS UIlabel怎么加载html字符串 富文本的用法
  5. java 自带写日志包_jdk自带的日志工具实操总结(亲测有效)
  6. arcgis栅格邻域统计_地理工具学习--arcgis篇:单工具学习(14)
  7. java后端技术路线_Java后端精选技术:Java的反射机制
  8. 计算机机房的安全等级分,计算机机房安全等级的划分标准是什么
  9. 2021年上半年系统集成项目管理工程师综合知识真题及答案解析
  10. 给你的网站添加3D地球显示的访客统计(使用RevolverMaps)