等待多线程完成的CountDownLatch
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相关推荐
- 并发工具类(一)等待多线程完成的CountDownLatch
简介 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个s ...
- Java 多线程之闭锁-CountDownLatch
实现并发的最直接方式是在操作系统级别使用进程.进程是运行在自己的地址空间内的自包容程序.多任务操作系统可以通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个进程的.操作系统将进程相互隔 ...
- 【高并发】JUC中等待多线程完成的工具类CountDownLatch
文章目录 1.概述 2.CountDownLatch介绍 3.案例 3.1 示例1:一个简单的示例 3.1 示例2:等待指定的时间 3.1 示例3:2个CountDown结合使用的示例 6.源码 6. ...
- Java常用多线程辅助工具---countdownLatch
为什么80%的码农都做不了架构师?>>> 前言 上一篇博文说到semaphore,一个加强版的synchronized,该多线程辅助工具适用于控制对资源操作或者访问的场景.现在有一张 ...
- 多线程同步器之CountDownLatch
文章目录 CountDownLatch是什么 核心方法 构造方法 常用的其他三个方法 使用案例 CountDownLatch是什么 countDownLatch是在java1.5被引入,可以翻译为计数 ...
- 多线程Runnable、CountDownLatch运行代码示例
Runnable 示例代码 CountDownLatch 示例代码 package com.doggy.doggy;import lombok.extern.slf4j.Slf4j;import ja ...
- Java多线程并发控制工具CountDownLatch,实现原理及案例
跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理. 作者简介:笔名seaboat,擅长工程算法.人工智能算法.自然语言处理.架构.分布式.高并发.大数据和搜索引擎等方面的 ...
- 闭锁java_java多线程学习十::::CountDownLatch闭锁
请看以下的代码 package rs.thread.day0504; import java.util.concurrent.CountDownLatch; /** * @auther rs * @d ...
- 主线程如何等待多线程完成 返回数据_多线程基础体系知识清单
作者:Object 来源:https://juejin.im/user/5d53e1f6f265da03af19cae0/posts 前言 本文会介绍Java中多线程与并发的基础,适合初学者食用. 线 ...
最新文章
- 史上最深(sàng)入(xīn)浅(bìng)出(kuáng)的IT术语解读
- 期末复习、化学反应工程科目(第二章)
- Docker Client(Docker 客户端)
- 异星工厂 自动机器人_刚刚,ABB机器人全球最大机器人超级工厂在康桥动工! 投资10亿元,用机器人造机器人...
- 【SpringBoot】在IOC之外的类中使用IOC内部的Bean
- Codeforces Round #696
- 平衡二叉树的自顶向下递归和自底向上递归
- 人生理解---2、看《程序员年龄增大后的职业出路是什么》有感
- 转:实战 SSH 端口转发
- cat3 utp是不是网线_CAT网线知识
- linux命令查看系统日期,Linux系统查看当前时间的命令
- 国产操作系统之优麒麟安装
- html链接位置移动,锚点链接点击缓慢移动到目标位置
- servicecontroller 无法打开计算机 服务,ServiceController似乎无法停止服务
- 易语言服务器端口总被占用,易语言检测端口是否被占用的代码
- 云短信使用——阿里云短信使用步骤
- excel更改页眉页脚_如何在Excel的页眉和页脚中键入“&”号
- 花1亿扶持优质红人,如涵推动网红经济出圈之路有何深意?
- 57q/5oCn5Luj5pWw5Y+K5YW25bqU55So56ysNeeJiOS4reaWh1BERui1hOa6kA==
- 同步IO(阻塞IO、非阻塞IO), 异步IO的理解