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的更多相关文章

  1. 【Java并发工具类】CountDownLatch和CyclicBarrier

    前言 下面介绍协调让多线程步调一致的两个工具类:CountDownLatch和CyclicBarrier. CountDownLatch和CyclicBarrier的用途介绍 CountDownLat ...

  2. java 并发工具类CountDownLatch & CyclicBarrier

    一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...

  3. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

  4. 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger

    1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ...

  5. Java并发工具类CountDownLatch源码中的例子

    Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pai ...

  6. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  7. 基于AQS实现的Java并发工具类

    本文主要介绍一下基于AQS实现的Java并发工具类的作用,然后简单谈一下该工具类的实现原理.其实都是AQS的相关知识,只不过在AQS上包装了一下而已.本文也是基于您在有AQS的相关知识基础上,进行讲解 ...

  8. JAVA并发工具类---------------(CountDownLatch和CyclicBarrier)

    CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进 ...

  9. 线程并发工具类之CountDownLatch的使用及原理分析

    原文链接:http://www.studyshare.cn/blog/details/1149/1 java开发工具下载地址及安装教程大全,点这里.更多技术文章,在这里. 一.定义 CountDown ...

随机推荐

  1. 03 解析库之Beautifulsoup模块

    Beautifulsoup模块   一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式 ...

  2. BZOJ 1430 小猴打架 - prufer数列

    描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过$N-1$次打架之后,整个森林的小猴都会成 ...

  3. 讲真的,千万别得罪会PS的人

    传说中有一种软件炒鸡可怕 那就是PS,专业术语是photoshop! 它能让你貌美如花 也能让你瞬间丑得掉渣 更可怕的是网络上大神的出现 简直让我们难以想象的厉害! 下面大家一起来欣赏一下 那些大神帮 ...

  4. Laravel中用GuzzleHttp

    阅读数:14715 今天项目中用到GuzzleHttp,开始不知道怎么用,其实还是很简单的. 直接在项目根目录,输入以下命令 composer require guzzlehttp/guzzle 1 ...

  5. Storm 系列(二)实时平台介绍

    Storm 系列(二)实时平台介绍 本章中的实时平台是指针对大数据进行实时分析的一整套系统,包括数据的收集.处理.存储等.一般而言,大数据有 4 个特点: Volumn(大量). Velocity(高 ...

  6. mysq 日期l查询

    pym=mysql(host = '#', port = 3306, user = '#',passworld='#',database='#') #根据起始和结束时间 charge_sql = 'S ...

  7. 2018.10.12 NOIP模拟 字符处理(模拟)

    传送门 sb模拟,考试跟着sb了90分. 代码

  8. 解决yum安装时 Cannot retrieve repository metadata (repomd.xml) for repository

    打开/etc/yum.repos.d/CentOS6-Base-163.repo 将下面的baseUrl的地址换成网上最新 # CentOS-Base.repo## The mirror system ...

  9. A标签中传递的中文参数到Servlet 后台request.getParameter()接收时出现中文乱码

    package util; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequ ...

  10. C#操作Excel(创建、打开、读写、保存)几种方法的总结

    在.NET开发中,不管是web程序还是桌面软件(尤其是涉及数据库操作的MIS系统等),常常需操作Excel,如导出数据到Excel,读取Excel中数据到程序中等.总结起来,其操作不外乎创建.打开.读 ...