2019独角兽企业重金招聘Python工程师标准>>>

简介

CountDownLatch 允许一个或多个线程等待其他线程完成操作。

应用场景

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用join。代码如下:

public class JoinCountDownLatchTest {public static void main(String[] args) throws InterruptedException {Thread parser1 = new Thread(new Runnable() {@Overridepublic void run() {}});Thread parser2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("parser2 finish");}});parser1.start();parser2.start();parser1.join();parser2.join();System.out.println("all parser finish");}}

join用于让当前执行线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远wait,代码片段如下,wait(0)表示永远等待下去。

while (isAlive()) {wait(0);
}

直到join线程中止后,线程的this.notifyAll会被调用,调用notifyAll是在JVM里实现的,所以JDK里看不到,有兴趣的同学可以看看JVM源码。JDK不推荐在线程实例上使用wait,notify和notifyAll方法。

而在JDK1.5之后的并发包中提供的CountDownLatch也可以实现join的这个功能,并且比join的功能更多。

<pre>public class CountDownLatchTest {static CountDownLatch c = new CountDownLatch(2);public static void main(String[] args) throws InterruptedException {new Thread(new Runnable() {@Overridepublic void run() {System.out.println(1);c.countDown();System.out.println(2);c.countDown();}}).start();c.await();System.out.println("3");}}

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。

当我们调用一次CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,你只需要把这个CountDownLatch的引用传递到线程里。

其他方法

如果有某个解析sheet的线程处理的比较慢,我们不可能让主线程一直等待,所以我们可以使用另外一个带指定时间的await方法,await(long time, TimeUnit unit): 这个方法等待特定时间后,就会不再阻塞当前线程。join也有类似的方法。

注意:计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一个线程调用countDown方法 happen-before 另外一个线程调用await方法。

扩展阅读:http://www.infoq.com/cn/articles/java8-abstractqueuedsynchronizer

转载于:https://my.oschina.net/viakiba/blog/1456754

等待多线程完成的CountDownLatch相关推荐

  1. 并发工具类(一)等待多线程完成的CountDownLatch

    简介 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个s ...

  2. Java 多线程之闭锁-CountDownLatch

    实现并发的最直接方式是在操作系统级别使用进程.进程是运行在自己的地址空间内的自包容程序.多任务操作系统可以通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个进程的.操作系统将进程相互隔 ...

  3. 【高并发】JUC中等待多线程完成的工具类CountDownLatch

    文章目录 1.概述 2.CountDownLatch介绍 3.案例 3.1 示例1:一个简单的示例 3.1 示例2:等待指定的时间 3.1 示例3:2个CountDown结合使用的示例 6.源码 6. ...

  4. Java常用多线程辅助工具---countdownLatch

    为什么80%的码农都做不了架构师?>>> 前言 上一篇博文说到semaphore,一个加强版的synchronized,该多线程辅助工具适用于控制对资源操作或者访问的场景.现在有一张 ...

  5. 多线程同步器之CountDownLatch

    文章目录 CountDownLatch是什么 核心方法 构造方法 常用的其他三个方法 使用案例 CountDownLatch是什么 countDownLatch是在java1.5被引入,可以翻译为计数 ...

  6. 多线程Runnable、CountDownLatch运行代码示例

    Runnable 示例代码 CountDownLatch 示例代码 package com.doggy.doggy;import lombok.extern.slf4j.Slf4j;import ja ...

  7. Java多线程并发控制工具CountDownLatch,实现原理及案例

    跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理. 作者简介:笔名seaboat,擅长工程算法.人工智能算法.自然语言处理.架构.分布式.高并发.大数据和搜索引擎等方面的 ...

  8. 闭锁java_java多线程学习十::::CountDownLatch闭锁

    请看以下的代码 package rs.thread.day0504; import java.util.concurrent.CountDownLatch; /** * @auther rs * @d ...

  9. 主线程如何等待多线程完成 返回数据_多线程基础体系知识清单

    作者:Object 来源:https://juejin.im/user/5d53e1f6f265da03af19cae0/posts 前言 本文会介绍Java中多线程与并发的基础,适合初学者食用. 线 ...

最新文章

  1. 史上最深(sàng)入(xīn)浅(bìng)出(kuáng)的IT术语解读
  2. 期末复习、化学反应工程科目(第二章)
  3. Docker Client(Docker 客户端)
  4. 异星工厂 自动机器人_刚刚,ABB机器人全球最大机器人超级工厂在康桥动工! 投资10亿元,用机器人造机器人...
  5. 【SpringBoot】在IOC之外的类中使用IOC内部的Bean
  6. Codeforces Round #696
  7. 平衡二叉树的自顶向下递归和自底向上递归
  8. 人生理解---2、看《程序员年龄增大后的职业出路是什么》有感
  9. 转:实战 SSH 端口转发
  10. cat3 utp是不是网线_CAT网线知识
  11. linux命令查看系统日期,Linux系统查看当前时间的命令
  12. 国产操作系统之优麒麟安装
  13. html链接位置移动,锚点链接点击缓慢移动到目标位置
  14. servicecontroller 无法打开计算机 服务,ServiceController似乎无法停止服务
  15. 易语言服务器端口总被占用,易语言检测端口是否被占用的代码
  16. 云短信使用——阿里云短信使用步骤
  17. excel更改页眉页脚_如何在Excel的页眉和页脚中键入“&”号
  18. 花1亿扶持优质红人,如涵推动网红经济出圈之路有何深意?
  19. 57q/5oCn5Luj5pWw5Y+K5YW25bqU55So56ysNeeJiOS4reaWh1BERui1hOa6kA==
  20. 同步IO(阻塞IO、非阻塞IO), 异步IO的理解

热门文章

  1. c语言查找星期几,新手做的日历表及查找日期是星期几
  2. 两千年是不是闰年 输出错误_干货!AMOS常见的10种错误及解决办法!
  3. Android Studio 代码混淆(你真的会混淆吗)
  4. 【软件构造】第二章 软件构建的过程和工具(2)
  5. Kibana安装及简单使用
  6. Yii2.X 多语言-类图
  7. PushYourself
  8. 从千团大战到网贷战国,烧钱千亿背后的底层用户增长逻辑
  9. PM应该找哪些副业?
  10. PMcaff 2015上半年干货精选,不容错过哦~