CountDownLacth

CountDownLacth(倒计数锁存器)到底有什么用呢?我们来看下面这个场景。

我们又有小片片要开始拍摄了,这个小片片需要5个演员来演,开演之前,导演需要这5个演员全部准备好才能Action,5个演员听到导演叫Action就开演了。

使用CountDownLacth完成以上场景。

public class CountDownLatchDemo {private static final Random RANDOM = new Random();private static final String[] ACTORS ={"波多野结衣","吉泽明步","苍井空","小泽玛利亚","泷泽萝拉"};static class Actor implements Runnable{private String name ;private CountDownLatch readyLacth;private CountDownLatch startLacth;public Actor(String name,CountDownLatch readyLacth,CountDownLatch startLacth){this.name = name;this.readyLacth = readyLacth;this.startLacth = startLacth;}@Overridepublic void run() {try {int readyTime = RANDOM.nextInt(1000);System.out.println(name + ":我需要" + readyTime/100 + "分钟时间准备.");//模拟准备时间Thread.sleep(readyTime);System.out.println(name + ":我已经准备好了!");readyLacth.countDown();//等待导演发令startLacth.await();System.out.println(name + ":我开始表演了,aaaaa,oooooooo,kimoji");} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {//导演的Lacth,每个演员准备好,该Latch就-1,需要等待所有演员准备好CountDownLatch readyLacth = new CountDownLatch(ACTORS.length);//演员的Lacth,需要等待导演叫开始,该latch -1CountDownLatch startLacth = new CountDownLatch(1);ExecutorService executorService = Executors.newCachedThreadPool();for(int i=0;i<ACTORS.length;i++){Actor actor = new Actor(ACTORS[i],readyLacth,startLacth);executorService.execute(actor);}readyLacth.await();startLacth.countDown();System.out.println("导演 : Action!");executorService.shutdown();}}
波多野结衣:我需要5分钟时间准备.
吉泽明步:我需要2分钟时间准备.
苍井空:我需要3分钟时间准备.
小泽玛利亚:我需要6分钟时间准备.
泷泽萝拉:我需要4分钟时间准备.
吉泽明步:我已经准备好了!
苍井空:我已经准备好了!
泷泽萝拉:我已经准备好了!
波多野结衣:我已经准备好了!
小泽玛利亚:我已经准备好了!
导演 : Action!
苍井空:我开始表演了,aaaaa,oooooooo,kimoji
小泽玛利亚:我开始表演了,aaaaa,oooooooo,kimoji
吉泽明步:我开始表演了,aaaaa,oooooooo,kimoji
波多野结衣:我开始表演了,aaaaa,oooooooo,kimoji
泷泽萝拉:我开始表演了,aaaaa,oooooooo,kimoji

CyclicBarrier

现在,我们要拍两个场景,把演员分成两组(人数一样),导演要指挥拍这两个场景。

使用CountDownLacth也可以完成这个需求,在第一个场景拍摄完毕后重设CountDownLacth。使用CyclicBarrier则可以重复使用。

使用CyclicBarrier完成如上需求。

public class CyclicBarrierDemo {private static final Random RANDOM = new Random();private static final String[] ACTORS1 ={"波多野结衣","吉泽明步","苍井空"};private static final String[] ACTORS2 ={"小泽玛利亚","泷泽萝拉","小川阿佐美"};static class Actor implements Runnable{private String name ;private CyclicBarrier barrier;public Actor(String name,CyclicBarrier barrier){this.name = name;this.barrier = barrier;}@Overridepublic void run() {try {int readyTime = RANDOM.nextInt(1000);System.out.println(name + ":我需要" + readyTime/100 + "分钟时间准备.");//模拟准备时间Thread.sleep(readyTime);System.out.println(name + ":我已经准备好了!");//等待导演发令barrier.await();System.out.println(name + ":我开始表演了,aaaaa,oooooooo,kimoji");} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {CyclicBarrier barrier = new CyclicBarrier(ACTORS1.length, new Runnable() {public void run() {System.out.println("导演:Action!");}});for (int i = 0; i < ACTORS1.length; i++) {Thread t = new Thread(new Actor(ACTORS1[i],barrier));t.start();}Thread.sleep(10000);System.out.println("==============更换场景==========================");for (int i = 0; i < ACTORS2.length; i++) {Thread t = new Thread(new Actor(ACTORS2[i],barrier));t.start();}}
}
波多野结衣:我需要4分钟时间准备.
吉泽明步:我需要0分钟时间准备.
苍井空:我需要6分钟时间准备.
吉泽明步:我已经准备好了!
波多野结衣:我已经准备好了!
苍井空:我已经准备好了!
导演:Action!
苍井空:我开始表演了,aaaaa,oooooooo,kimoji
吉泽明步:我开始表演了,aaaaa,oooooooo,kimoji
波多野结衣:我开始表演了,aaaaa,oooooooo,kimoji
==============更换场景==========================
小泽玛利亚:我需要6分钟时间准备.
泷泽萝拉:我需要1分钟时间准备.
小川阿佐美:我需要8分钟时间准备.
泷泽萝拉:我已经准备好了!
小泽玛利亚:我已经准备好了!
小川阿佐美:我已经准备好了!
导演:Action!
小川阿佐美:我开始表演了,aaaaa,oooooooo,kimoji
泷泽萝拉:我开始表演了,aaaaa,oooooooo,kimoji
小泽玛利亚:我开始表演了,aaaaa,oooooooo,kimoji

Semaphore

最近的女星有点懒惰,爱耍大牌,准备很久都准备不好,耽误时间。都是大牌儿,又不敢得罪,导演组决定,最先准备好的先拍,后面来的按顺序排队,等前面的杀青了再拍,不耽误时间。

这时候使用Semaphore就比较方便啦

public class SemaphoreDemo {private static final Random RANDOM = new Random();private static final String[] ACTORS ={"波多野结衣","吉泽明步","苍井空","小泽玛利亚","泷泽萝拉","小川阿佐美"};static class Actor implements Runnable{private String name ;private Semaphore semaphore;public Actor(String name,Semaphore semaphore){this.name = name;this.semaphore = semaphore;}@Overridepublic void run() {try {int readyTime = RANDOM.nextInt(1000);System.out.println(name + ":我需要" + readyTime/100 + "分钟时间准备.");//模拟准备时间Thread.sleep(readyTime);if(semaphore.availablePermits()>0){System.out.println(name + ":我已经准备好了!");}else{System.out.println(name + ":我已经准备好了!啊,来晚了呢");}semaphore.acquire();System.out.println(name + ":我开始表演了,aaaaa,oooooooo,kimoji");Thread.sleep(1000);System.out.println(name + ":演完啦!");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {ExecutorService executorService= Executors.newCachedThreadPool();final Semaphore semaphore = new Semaphore(3);for(int i=0;i<ACTORS.length;i++){Actor actor = new Actor(ACTORS[i],semaphore);executorService.execute(actor);}executorService.shutdown();}
}
吉泽明步:我需要6分钟时间准备.
波多野结衣:我需要9分钟时间准备.
苍井空:我需要1分钟时间准备.
小泽玛利亚:我需要4分钟时间准备.
泷泽萝拉:我需要5分钟时间准备.
小川阿佐美:我需要8分钟时间准备.
苍井空:我已经准备好了!
苍井空:我开始表演了,aaaaa,oooooooo,kimoji
小泽玛利亚:我已经准备好了!
小泽玛利亚:我开始表演了,aaaaa,oooooooo,kimoji
泷泽萝拉:我已经准备好了!
泷泽萝拉:我开始表演了,aaaaa,oooooooo,kimoji
吉泽明步:我已经准备好了!啊,来晚了呢
小川阿佐美:我已经准备好了!啊,来晚了呢
波多野结衣:我已经准备好了!啊,来晚了呢
苍井空:演完啦!
吉泽明步:我开始表演了,aaaaa,oooooooo,kimoji
小泽玛利亚:演完啦!
小川阿佐美:我开始表演了,aaaaa,oooooooo,kimoji
泷泽萝拉:演完啦!
波多野结衣:我开始表演了,aaaaa,oooooooo,kimoji
吉泽明步:演完啦!
小川阿佐美:演完啦!
波多野结衣:演完啦!

CountDownLatch CyclicBarrier Semaphore相关推荐

  1. (面经总结)一篇文章带你完整复习 Java 中并发关键字(CountDownLatch/CyclicBarrier/Semaphore/Volatile)

    文章目录 一.倒计数器:CountDownLatch 二.循环栅栏:CyclicBarrier 三.信号量:Semaphore 四.volatile 关键字的作用 一.倒计数器:CountDownLa ...

  2. JUC介绍--常用辅助类(CountDownLatch CyclicBarrier Semaphore)

    CountDownLatch减法计数器 每次有线程调用countDownLatch.countDown()数量就-1 数量减到0时,countDownLatch.await()会被唤醒,继续向下执行 ...

  3. CountDownLatch和Semaphore使用场景

    CountDownLatch CountDownLatch位于java.util.concurrent包下,利用它可以实现类似计数器的功能.比如有一个任务A,它要等到其它3任务完成才能执行,此时就可以 ...

  4. 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...

    1.Semaphore  信号量 Semaphore(信号量)是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得semaphore.如果semaphore的内部计数 ...

  5. Java并发工具类:CountDownLatch、Semaphore、CyclicBarrier、Exchanger、Phaser

    本文目录: 1.CountDownLatch(闭锁) 1.CountDownLatch 例子 2.CyclicBarrier(循环栅栏) 1.CyclicBarrier 例子 2.CountDownL ...

  6. Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

    之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurre ...

  7. LeetCode 1195. Fizz Buzz Multithreaded--并发系列题目--Java 解法--AtomicInteger/CountDownLatch/CyclicBarrier

    题目地址:Fizz Buzz Multithreaded - LeetCode Write a program that outputs the string representation of nu ...

  8. ReentrantLock+线程池+同步+线程锁

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

  9. java高并发编程(二)

    马士兵java并发编程的代码,照抄过来,做个记录. 一.分析下面面试题 /*** 曾经的面试题:(淘宝?)* 实现一个容器,提供两个方法,add,size* 写两个线程,线程1添加10个元素到容器中, ...

最新文章

  1. linux下mysql root密码忘记修改方法
  2. xampp去运行php文件_从0开始构建一个属于你自己的PHP框架
  3. 选中条目android spinner的使用
  4. Eureka出现Root name ‘timestamp‘ does not match expected (‘instance‘) for type xxx的错误,如何解决?
  5. 音视频技术开发周刊 81期
  6. python对excel增删改查_Python之Excel 优雅操作手法 精选
  7. mysql配置两个猪数据库_Linux下安装启动多个Mysql
  8. Tridiv:基于 Web 的 CSS 编辑器,创建炫丽 3D 图形
  9. 数据库主从延迟导致查询不准确的解决思路
  10. 理解 Linux 条件变量
  11. socket 和 SocketServer 模块
  12. 扩展欧几里得算法 思想及模板代码
  13. 企业微信商户号是什么?如何开通?
  14. 直接学 Vue 3 吧 —— 对话 Vue.js 作者尤雨溪
  15. 投影幕布尺寸计算器_投影距离和屏幕尺寸计算器
  16. VMware Vsphere-下
  17. 学无止境——给网友的公开信
  18. 基于EC57 标准 上的数据库 测试室颤VF节律准确性的一个问题
  19. CADe_SIMu V1.0.0.1手把手学习笔记(1)
  20. NMT、enc-dec的一些笔记

热门文章

  1. 线性表☞顺序表篇(7000字细致入微讲解)
  2. 现货黄金指标精讲(布林通道)
  3. Filtration and Distillation: Enhancing Region Attention for Fine-Grained Visual Categorization
  4. 篮球,我即将跟你说再见(4)
  5. Scanner的各种用法
  6. APP活动策划怎么做?活动策划是APP运营最重要的吗?
  7. libgomp.so.1:version 'GOMP_4.0' not fount 问题的解决方案
  8. 14亿人共同的话题:现在做什么最赚钱?
  9. 大连四六级培训百家外语英国有学校宣布接受四六级成绩?
  10. 这所院校复试只刷低分,有9人擦线竟直接放弃复试!