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 ...
随机推荐
- oracle 用一个表的一个字段更新另一个表的一个字段
案列: 想更新A表的name字段,由于失误,在写这个表的时候,这个字段没有写,发现的时候,已经写了一个多月的数据了.改了之后的过程,会正常的写这个字段, 可是已经写了的数据也不能铲了,重新计算. 好在 ...
- 2018.10.01 NOIP模拟 偷书(状压dp)
传送门 状压dp经典题. 令f[i][j]f[i][j]f[i][j]表示到第i个,第i−k+1i-k+1i−k+1~iii个物品的状态是j时的最大总和. 然后简单维护一下转移就行了. 由于想皮一下果 ...
- hdu-1141
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1141 参考文章:https://blog.csdn.net/fei____fei/article/de ...
- python 实现排列组合
1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__ ...
- 基于MOD13A1的锡林郭勒草原近13年植被覆盖变化 分析
内蒙古师范大学地理科学学院 内蒙古师范大学遥感与地理信息系统重点实验室 摘要:本研究以内蒙古锡林郭勒草原为研究区,基于MOD13A1遥感数据,经过遥感预处理,得到研究区2001-2013年共13年夏季 ...
- (最小生成树) Borg Maze -- POJ -- 3026
链接: http://poj.org/problem?id=3026 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82831#probl ...
- MySQL 分表和分区
1.为什么需要分表和分区 在开发的过程中,经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,如果涉及联合查询的情况,性能更加 ...
- 从0学习JQ
转 张子秋的博客 为以后用到的时候好查询! 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 ...
- Python学习-23.Python中的函数——isinstance
在Python中可以使用isinstance函数来判断某个值或变量是否为某个类型. 例子: print(isinstance(1,int)) print(isinstance(1,float)) pr ...
- The transaction associated with this command is not the connection's active transaction
The fix is fairly simple: if you want a Dapper query to participate in a connection, explicitly deno ...