Java并发工具类之CountDownLatch
CountDownLatch允许一个或则多个线程等待其他线程完成操作。
假如我们有这样的需求:我们需要解析一个excel文件中的多个sheet,我们可以考虑使用多线程,每一个线程解析excel中的一个sheet表格,等所有的线程都完成解析之后,程序提示解析完成,输出解析结果。要实现这个需求,最简单的方式是使用Thread类的join方法,等待所有的线程都完成解析之后再提示解析完成,我们可以用一下代码完成解析:
public class ReadExcelSheetsUserThreadJoinTest { public static void main(String[] args) throws InterruptedException { Thread sheet1Thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("解析sheet1");
}
}); Thread sheet2Thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("解析sheet2");
}
}); sheet1Thread.start();
sheet2Thread.start();
sheet1Thread.join();
sheet2Thread.join();
System.out.print("所有的表格解析完成");
}
}
输出结果:
解析sheet1
解析sheet2
所有的表格解析完成
join用于让当前执行线程等待join线程执行结束,其执行原理是不停的检查join线程是否存活,如果join线程存活,则让当前线程永远等待。代码如下,其中wait(0)表示永远等待。
while (isAlive()) {
wait();
}
直到join线程终止后,线程的this.notifyAll()方法被调用,大家可以参考JVM源码,查看notifyAll方法被调用的过程。
在JDK1.5之后,Java的并发包提供了CountDownLatch,CountDownLatch也可以实现线程的join功能,并且比Thread的join方法提供的功能更多,使用CountDownLatch实现上述需求的代码如下:
public class ReadExcelSheetsUseCountDownLatchTest { private static CountDownLatch countDownLatch = new CountDownLatch(); public static void main(String[] args) throws InterruptedException { Thread sheet1Thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("解析sheet1");
countDownLatch.countDown();
}
}); Thread sheet2Thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("解析sheet2");
countDownLatch.countDown();
}
}); sheet1Thread.start();
sheet2Thread.start();
countDownLatch.await();
System.out.print("所有的表格解析完成");
} }
CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待n个点完成,就传入n,我们调用CountDownLatch的countDown方法的时候,n就会减1,await方法会阻塞当前线程直到n变为0,由于CountDownLatch的countDown方法可以用在任何地方,因此这里的n可以是n个线程,也可以是1个线程里面的n个步骤。编程的时候只需要把CountDownLatch的引用传到线程即可。
有时候,我们不希望执行线程一直等待下去,这个时候我们可以使用CountDownLatch的await(long time,TimeUnit unit),这个方法在特定的时间之后就不会再阻塞执行线程,当然join也有类似的重载方法。
计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一个线程调用countDown方法happen-before,另外一个线程调用await方法。
Java并发工具类之CountDownLatch的更多相关文章
- 【Java并发工具类】CountDownLatch和CyclicBarrier
前言 下面介绍协调让多线程步调一致的两个工具类:CountDownLatch和CyclicBarrier. CountDownLatch和CyclicBarrier的用途介绍 CountDownLat ...
- java 并发工具类CountDownLatch & CyclicBarrier
一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...
- Java并发工具类 - CountDownLatch
Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...
- 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger
1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ...
- Java并发工具类CountDownLatch源码中的例子
Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pai ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
- 基于AQS实现的Java并发工具类
本文主要介绍一下基于AQS实现的Java并发工具类的作用,然后简单谈一下该工具类的实现原理.其实都是AQS的相关知识,只不过在AQS上包装了一下而已.本文也是基于您在有AQS的相关知识基础上,进行讲解 ...
- JAVA并发工具类---------------(CountDownLatch和CyclicBarrier)
CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进 ...
- 线程并发工具类之CountDownLatch的使用及原理分析
原文链接:http://www.studyshare.cn/blog/details/1149/1 java开发工具下载地址及安装教程大全,点这里.更多技术文章,在这里. 一.定义 CountDown ...
随机推荐
- 参看dll参数类型
http://blog.csdn.net/chinabinlang/article/details/7698459 验证
- a标签的四个伪类
A标签的css样式 CSS为一些特殊效果准备了特定的工具,我们称之为“伪类”.其中有几项是我们经常用到的,下面我们就详细介绍一下经常用于定义链接样式的四个伪类,它们分别是: :link :v ...
- 2018.09.27 codeforces1045D. Interstellar battle(期望dp)
传送门 一道有意思的期望dp. 题意是给出一棵树,每个点最开始都有一个gg的概率,有m次修改,每次修改会把某个点gg的概率更换掉,让你求出每次修改之后整个树被分成的连通块的数量的期望(gg掉的点不算) ...
- 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)
传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...
- hdu-2159(完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 思路:完全背包,但有次数的限制,因此,对次数进行dp,判断次数是否超限. #include< ...
- FreeTextBox备忘
添加对4.0的dll文件引用 吧aspnet_client目录 copy到根目录下 设置文件上传目录属性ImageGalleryPath 设置相册属性到 ftb.imagegallery.aspx位置 ...
- mysql-5.7.10普通安装
这里安装的是最新的MySQL 5.7.10,下载网址为:http://dev.mysql.com/downloads/mysql/,本文选择是的"Linux - Generic"下 ...
- hdu2602 Bone Collector(01背包) 2016-05-24 15:37 57人阅读 评论(0) 收藏
Bone Collector Problem Description Many years ago , in Teddy's hometown there was a man who was call ...
- python 的几种启动方式
python 的几种启动方式 (1)利用Win的操作系统的:命令行工具 cmd.exe Win + R 调出运行对话框,然后输入cmd,即可调出“命令提示符对话框” 或者 在菜单中店家附件中的命令提 ...
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...