from https://www.jianshu.com/p/cef6243cdfd9

1.CountDownLatch是什么?

CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。

典型的用法是将一个程序分为n个互相独立的可解决任务,并创建值为n的CountDownLatch。当每一个任务完成时,都会在这个锁存器上调用countDown,等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。

2.一个简单的例子

在主线程中,开5个子线程来执行20个任务,只有等任务全部完成后,主线程才能再去做其它事。

测试代码:

public class CountDownLatchTest {

    private int threadNum = 5;//执行任务的子线程数量
private int workNum = 20;//任务数量
private ExecutorService service;
private ArrayBlockingQueue<String> blockingQueue;
private CountDownLatch latch; @Before
public void setUp() {
service = Executors.newFixedThreadPool(threadNum, new ThreadFactoryBuilder().setNameFormat("WorkThread-%d").build());
blockingQueue = new ArrayBlockingQueue<>(workNum);
for (int i = 0; i < workNum; i++) {
blockingQueue.add("任务-" + i);
}
latch = new CountDownLatch(workNum);//计数器的值为任务的数量
} @Test
public void test() throws InterruptedException {
SoutUtil.print("主线程开始运行");
for (int i = 0; i < workNum; i++) {
service.execute(new WorkRunnable());
}
latch.await();//等待子线程的所有任务完成
SoutUtil.print("主线程去做其它事");
} //用blockQueue中的元素模拟任务
public String getWork() {
return blockingQueue.poll();
} class WorkRunnable implements Runnable { public void run() {
String work = getWork();
performWork(work);
latch.countDown();//完成一个任务就调用一次
}
} private void performWork(String work) {
SoutUtil.print("处理任务:" + work);
try {
//模拟耗时的任务
Thread.currentThread().sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }

执行结果为:

2016/12/09 22:23:02.860 main (CountDownLatchTest.java:36).test: 主线程开始运行
2016/12/09 22:23:02.862 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-0
2016/12/09 22:23:02.862 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-1
2016/12/09 22:23:02.862 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-2
2016/12/09 22:23:02.862 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-3
2016/12/09 22:23:02.863 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-4
2016/12/09 22:23:02.926 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-7
2016/12/09 22:23:02.926 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-5
2016/12/09 22:23:02.926 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-8
2016/12/09 22:23:02.926 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-6
2016/12/09 22:23:02.926 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-9
2016/12/09 22:23:02.992 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-11
2016/12/09 22:23:02.992 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-12
2016/12/09 22:23:02.992 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-13
2016/12/09 22:23:02.992 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-14
2016/12/09 22:23:02.992 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-10
2016/12/09 22:23:03.057 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-16
2016/12/09 22:23:03.057 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-18
2016/12/09 22:23:03.057 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-15
2016/12/09 22:23:03.057 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-17
2016/12/09 22:23:03.057 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-19
2016/12/09 22:23:03.120 main (CountDownLatchTest.java:41).test: 主线程去做其它事

参考目录:

  1. 什么时候使用CountDownLatch
  2. JDK1.8源码分析之CountDownLatch
  3. CountDownLatch源码的理解
  4. countdownlatch源码分析

作者:天然鱼
链接:https://www.jianshu.com/p/cef6243cdfd9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

CountDownLatch的简单使用的更多相关文章

  1. CountDownLatch的简单讲解

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  2. CountDownLatch的简单理解

    CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用). CountDownLatch能够使一个 ...

  3. CountDownLatch的简单实现

    1. @Data public abstract class BaseLatch { private int limit; protected int running; BaseLatch(int l ...

  4. JAVA中CountDownLatch的简单示例

    public static void main(String[] args) throws InterruptedException { CountDownLatch latch =new Count ...

  5. CountDownLatch的原理学习

    转载:http://blog.csdn.net/yanyan19880509/article/details/52349056 前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过Co ...

  6. CountDownLatch 和 CyclicBarrier 的运用及实现原理

    I.CountDownLatch 和 CyclicBarrier 的运用 CountDownlatch: 定义: 其是一个线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所 ...

  7. java共享锁实现原理及CountDownLatch解析

    前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过CountDownLatch的学习来了解java并发包中是如何实现共享锁的. CountDownLatch使用解说 CountDow ...

  8. java高级---->Thread之CountDownLatch的使用

    CountDownLatch是JDK 5+里面闭锁的一个实现,允许一个或者多个线程等待某个事件的发生.今天我们通过一些实例来学习一下它的用法. CountDownLatch的简单使用 CountDow ...

  9. Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒

    java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...

随机推荐

  1. JMeter元件的作用域与执行顺序

    元件的作用域 先来讨论一下元件有作用域.<JMeter基础元件介绍>一节中,我们介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器 是典型的不与其它元件发生交互作用 ...

  2. EntityManager对象管理

    根据EntityManager对象的管理方式,可以有以下两种类型: — 容器托管的(container-managed)EntityManager对象 容器托管的EntityManager对象最简单, ...

  3. Linux定时增量更新文件--转

    http://my.oschina.net/immk/blog/193926 动机与需求:现在有两台服务器A和B,由于A的存储随时会挂(某些原因),所以需要B机器上有A的备份,并且能够与A同步更新 一 ...

  4. 面向对象 OOP

    [面向对象编程OOP]   1 语言的分类 面向机器 :汇编语言 面向过程 :c语言 面向对象 :c++ Java PHP等   2 面向过程与面向对象 面向过程:专注于如何去解决一个问题的过程,编程 ...

  5. nodejs中引入art-template模板

    使用Webstorm创建nodejs express应用时,默认使用的是jade或者ejs模板,对于不习惯这两种模板语法的人来说确实不是很方便.没关系,这里我们使用art-template模板引擎,使 ...

  6. svn在commit后报错:is scheduled for addition, but is missing

    今天通过svn 的cr(code review)代码审核后,我欲执行svn ci -m"xxxxxxx(提交注释) ISSUE=3380305",但是没有提交成功,SVN报错啦! ...

  7. 移动端Push推送

    移动端Push推送 移动端开发逃不掉要做推送,这里给出服务端一种省时省力的解决方案. iOS:PushSharp.Apple.苹果有自己的推送服务,我们按照规则推送数据就好.这里我选取PushShar ...

  8. 从Java虚拟机角度分析类的实例化顺序

    1.首先展示一下实例代码(Son.java & Father.java) public class Father { public static int a=10;//父类的静态变量 stat ...

  9. flask之wtforms 表单验证(一)

    一  安装wtforms pip install wtforms 二  导入相关模块及对象 from wtforms import Form, widgets, validators from wtf ...

  10. 从官网下载mod_jk.so

    最近在搞apache和tomcat集群,这里就要用到mol_jk.so,在官网找了很久才知道在哪里下载,英语是硬伤啊. 1.打开tomcat官网 http://tomcat.apache.org/ 2 ...