并发工具类系列:

Java并发工具类(闭锁CountDownLatch)

Java并发工具类(栅栏CyclicBarrier)

Java并发工具类(信号量Semaphore)

闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。

CountDownLatch是一种灵活的闭锁实现,它可以使一个或者多个线程等待一组事件的发生。

闭锁状态包含一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示已经有一个事件已经发生了。而await方法等待计数器达到0,这表示所有需要等待的事件都已经发生。如果计数器的值非0,那么await会一直阻塞直到计数器为0,或者等待中的线程中断或者超时。 下面,我们以经典的运动员赛跑举例:

我们在这里设置了两个门,一个是开始门,一个是结束门。

  • 开始门: 所有运动员处于准备状态,等待教练的枪声。这时候运动员为n个,枪响只需要一声,等待的这一声枪响到了,开始门也就打开了,所有运动员开始跑。
  • 结束门: 教练等待所有运动员,当最后一个运动员也冲破底线,教练才能宣布所有人到达终点,这时候是教练等待n个运动员,直到n为0。

下面我们根据具体的代码来演示CountDownLatch的用法:

package concurrency;import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;class Runner implements Runnable {private static int counter = 0;private final int id = counter++;private static Random rand= new Random(47);private final CountDownLatch start_latch;private final CountDownLatch end_latch;public Runner(CountDownLatch start_latch, CountDownLatch end_latch) {this.start_latch = start_latch;this.end_latch = end_latch;}@Overridepublic void run() {try {start_latch.await();  //所有运动员都在准备状态中,等待教练释放开始门try {doWork();  //每个人跑步的时间不同end_latch.countDow n();  //跑完后,告诉教练跑完了} catch (InterruptedException e) {System.out.println("Interrupted Runner" + id);}} catch (InterruptedException e) {System.out.println("Interrupted Runner" + id);}}public void doWork() throws InterruptedException {TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));System.out.println(this + "completed");}@Overridepublic String toString() {return String.format("%1$-3d", id);}
}class Coach implements Runnable {private final CountDownLatch start_latch;private final CountDownLatch end_latch;public Coach(CountDownLatch start_latch, CountDownLatch end_latch) {this.start_latch = start_latch;this.end_latch = end_latch;}@Overridepublic void run() {start_latch.countDown();  //教练释放了开始门,运动员们都开始跑System.out.println("Coach say: Ready!!!!  Go!!!!");try {end_latch.await();  //当结束门的count down减为0时,教练宣布所有人都跑完了。System.out.println("All runner passed the end point");} catch (InterruptedException ex) {System.out.println(this + " interrupted");}}
}public class TestRunner {private static final int SIZE = 10;public static void main(String[] args) {ExecutorService exec = Executors.newCachedThreadPool();CountDownLatch startGate = new CountDownLatch(1);CountDownLatch endGate = new CountDownLatch(SIZE);for (int i = 0; i < SIZE; i++) {exec.execute(new Runner(startGate, endGate));}exec.execute(new Coach(startGate, endGate));exec.shutdown();}
}
复制代码

CountDownLatch强调的是一个线程(或多个)需要等待另外的n个线程干完某件事情之后才能继续执行。 上述例子,Coach线程是裁判,10个Runner是跑步的。运动员先准备,裁判喊跑,运动员才开始跑(这是第一次同步,对应startGate)。10个人谁跑到终点了,countdown一下,直到10个人全部到达,裁判喊停(这是第二次同步,对应endGate)。 最后运行结果如下:

Coach say: Ready!!!! Go!!!! 7 completed 9 completed 5 completed 8 completed 2 completed 0 completed 6 completed 4 completed 1 completed 3 completed All runner passed the end point

Java并发工具类(闭锁CountDownLatch)相关推荐

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

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

  2. 彻底理解Java并发:Java并发工具类

    本篇内容包括:Java 并发工具类的介绍.使用方式与 Demo,包括了 CountDownLatch(线程计数器).CyclicBarrier(回环栅栏).Semaphore(信号量) 以及 Exch ...

  3. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  4. Java并发工具类(三)Exchanger

    Java并发工具类(三)Exchanger 在J.U.C并发包中提供了一些工具类,可以供我们在日常的开发中,根据不同的情况去进行一些相关的并发控制,具体的类有: CountDownLatch Sema ...

  5. Java 并发编程之同步工具类闭锁 CountDownLatch

    Java 同步工具类CountDownLatch相当于一个计数器,假设一个方法,等待一个计数器从初始值5变为0,每使用一次countdown()方法,计数器的值减少1,当计数器的值为0时,触发某件事. ...

  6. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch

    上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...

  7. j.u.c系列(08)---之并发工具类:CountDownLatch

    写在前面 CountDownLatch所描述的是"在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待":用给定的计数 初始化 CountDownLatch.由于调 ...

  8. 死磕Java并发:J.U.C之并发工具类:CountDownLatch

    作者:chenssy 来源:Java技术驿站 在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有点儿相似. ...

  9. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

最新文章

  1. PHP函数学习nl2br(),strlen(),mb_strlen()
  2. 什么是三极管的倒置状态及其作用!
  3. Linux(Ubuntu)下MySQL的安装与配置
  4. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法
  5. Spring_Bean的作用域---和使用外部属性文件
  6. Envi和ArcGIS软件打开和处理.NC4数据
  7. “Jupyter的杀手”:Netflix发布新开发工具Polynot
  8. error: #error regenerate this file with a newer version of protoc.
  9. 编译原理拉链回填技术c语言,编译原理 第1、2、3、4章复习(期末).doc
  10. 如何走出创新者的窘境?走向2049
  11. 延续性动词与非延续性动词及其转换
  12. 【上海落户-个人感受】想到一个城市落户,需要提前打算。
  13. 学成在线项目(HTML+CSS)
  14. 百度地图添加家的位置图文教程
  15. 程序人生 - 只要看这一篇,车险全搞懂(值得收藏)
  16. java 填充字符串_Java字符串右补齐——String.format
  17. 20个免费的网络电话
  18. 有一对兔子,从出生后的第 3 个月起每个月都生一对兔子。小兔子长到第 3 个月后每个月又生一对兔子,假设所有的兔子都不死,问 20 个月内每个月的兔子总数为多少?
  19. Scrapy爬取IT桔子死亡公司库及资本机构数据
  20. lululemon最新报告建立全球幸福感基准

热门文章

  1. linux存储--inode详解(五)
  2. word关闭未响应_大众途观全景天窗遮阳卷帘无法关闭
  3. 新手理解的JS原型链
  4. [ CCO 2015 ] Artskjid
  5. tp3.2 连接两个数据库
  6. [field:softlinks/]逻辑过程
  7. CCF NOI1113 括号匹配
  8. Redis 为什么用跳表而不用平衡树?
  9. 理解与使用Javascript中的回调函数
  10. ASP.NET AJAX web chat application