摘要:本人邮箱欢迎转载转载请注明网址代码已经全部托管有需要的同学自行下载引言有一个同步助手可以让一个或一些线程等待直到另外一些线程执行完一些操作这就是理论在初始化的时候需要一个参数调用的线程会一直等待直到其他线程调用使清空为通常所有等待中的线程会
引言本人邮箱:
欢迎转载,转载请注明网址 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) 构造一个指定count的CountDownLatch
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()); Setthreads = 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.ucloud.cn/yun/69913.html
摘要:多线程同步工具箱之篇前言的多线程协调工具,,,都是在多线程代码中使用比较多的工具类之一。毫不夸张的说,这几个类,是等同于解决多线程问的包,实在有必要添加到程序员的工具箱里面。 Java多线程同步工具箱之CountDownLatch篇 前言 Java的多线程协调工具CountDownLatch,Semaphore,CyclicBarrier,ReadWriteLock都是在多线程代码中使...
摘要:线程可以调用的方法进入阻塞,当计数值降到时,所有之前调用阻塞的线程都会释放。注意的初始计数值一旦降到,无法重置。 showImg(https://segmentfault.com/img/remote/1460000016012041); 本文首发于一世流云的专栏:https://segmentfault.com/blog... 一、CountDownLatch简介 CountDow...
摘要:好了,继续向下执行,尝试获取锁失败后,会调用首先通过方法,将包装成共享结点,插入等待队列,插入完成后队列结构如下然后会进入自旋操作,先尝试获取一次锁,显然此时是获取失败的主线程还未调用,同步状态还是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首发于一世流云的专栏:https://segmentfa...
摘要:关于,最后有两点规律需要注意当的等待队列队首结点是共享结点,说明当前写锁被占用,当写锁释放时,会以传播的方式唤醒头结点之后紧邻的各个共享结点。当的等待队列队首结点是独占结点,说明当前读锁被使用,当读锁释放归零后,会唤醒队首的独占结点。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首发于一世流云的专栏:...
摘要:本人邮箱欢迎转载转载请注明网址代码已经全部托管有需要的同学自行下载引言讲完了和今天讲一个跟这两个类有点类似的移相器中引入了一种新的可重复使用的同步屏障称为移相器拥有与和类似的功劳但是这个类提供了更加灵活的应用和都是只适用于固定数量的参与者 本人邮箱: 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kcogithub: https://github....
阅读 628·2021-09-24 09:48
阅读 2491·2021-08-26 14:14
阅读 517·2019-08-30 13:08
阅读 1445·2019-08-29 15:22
阅读 3066·2019-08-29 11:06
阅读 1001·2019-08-26 18:26
阅读 1033·2019-08-26 13:53
阅读 2511·2019-08-26 12:21