一、CountDownLatch工具类介绍

CountDownLatch类是Java并发工具常用的四大工具之一,CountDownLatch允许一个或者多个线程等待其他线程完成工作。假设我们有这样的一个需求,我们需要解析一个Excel里多个sheet的据,这个时候我们考虑使用多 线程同时进行工作,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成将数据返回。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作。在这种情况之下我们就可以考虑使用CountDownLatch工具类。

  1
2 import java.util.concurrent.CountDownLatch;
3
4 public class CountDownLatchUserCase {
5
6 private static CountDownLatch countDownLatch = new CountDownLatch(5);
7
8 public static void main(String[] args) throws Exception{
9 //主线程开始读取Excel文档
10 new Excel().start();
11 long count = countDownLatch.getCount();
12 for(int i = 0;i < count;i++){
13 new Sheet().start();
14 }
15 }
16
17 static class Excel extends Thread{
18
19 @Override
20 public void run(){
21 try {
22 System.out.println("开始读取Excel文档,共有"+countDownLatch.getCount()+"个工人同时工作");
23 countDownLatch.await();
24 }catch (Exception e){
25 e.printStackTrace();
26 }
27 System.out.println("所有Excel文档工作读取完毕");
28 }
29 }
30
31 static class Sheet extends Thread{
32
33 @Override
34 public void run(){
35 System.out.println(Thread.currentThread().getName() + ",完成sheet读取工作....");
36 //完成其中一个sheet的工作 count - 1
37 countDownLatch.countDown();
38 }
39
40 }
41
42 }
43
  1 开始读取Excel文档,共有5个工人同时工作
2 Thread-4,完成sheet读取工作....
3 Thread-2,完成sheet读取工作....
4 Thread-3,完成sheet读取工作....
5 Thread-1,完成sheet读取工作....
6 Thread-5,完成sheet读取工作....
7 所有Excel文档工作读取完毕

CountDownLatch是通过一个计数器来实现的,当我们在new 一个CountDownLatch对象的时候需要带入该计数器值,该值就表示了线程的数量。每当一个线程完成自己的任务后,计数器的值就会减1。当计数器的值变为0时,就表示所有的线程均已经完成了任务,然后就可以恢复等待的线程继续执行了。

CountDownLatch类只提供了一个构造器:

  1 public CountDownLatch(int count) {  };  //参数count为计数值

CountDownLatch类中提供了3个最重要的方法:

  1 public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
2 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
3 public void countDown() { }; //将count值减1

二、CountDownLatch原理分析

CountDownLatch内部通过共享锁实现。CountDownLatch的构造函数接收一个int类型的参数作为计数器,这个计数器的值也可以理解为该共享锁可以获取的总次数。如果你想等待N个点完 成,这里就传入N。当我们调用CountDownLatch的countDown方法时,N就会减1,当线程调用await方法的时候,程序首先判断count的值是否为0,如果不会0的话则会阻塞当前线程一直等待直到为0为止。

注意:CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数 器的值。

CountDownLatch不能回滚重置。

Java并发之CountDownLatch工具类的更多相关文章

  1. Java并发之CyclicBarrier工具类

    一.CyclicBarrier工具类介绍 在上一篇文中我们介绍到了CountDownLatch工具类,其实CyclicBarrier和CountDownLatch工具类实现的功能差不多.我们可以从字面 ...

  2. Java并发之同步工具类

    1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...

  3. Java并发多线程 - 并发工具类JUC

    安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...

  4. Java并发之CountDownLatch的使用

    Java并发之CountDownLatch的使用 一. 简介 Java的并发包早在JDK5这个版本中就已经推出,而且Java的并发编程是几乎每个Java程序员都无法绕开的屏障.笔者今晚在家闲来无事,翻 ...

  5. Java 中的并发工具类

    Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...

  6. Java线程的并发工具类

    Java线程的并发工具类. 一.fork/join 1. Fork-Join原理 在必要的情况下,将一个大任务,拆分(fork)成若干个小任务,然后再将一个个小任务的结果进行汇总(join). 适用场 ...

  7. Rhino+envjs-1.2.js 在java运行网站js 工具类

    java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...

  8. java中常用的工具类(一)

    我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...

  9. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

随机推荐

  1. android放大镜效果实现

    概述 我相信很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView ex ...

  2. 在Cocos2D中改变动态物体为静态物体

    原文链接,有压缩和简化 1.导入一个新的头文件 首先你要知道,不是所有Chimpunk特性都通过Cocos2d的类暴露出来,比如CCPhysicsNode和CCPhysicsBody.对于一些更高级的 ...

  3. react-native-android之初次相识

    作为一名Android开发者,我的感觉就是,一步一卡,卡的潇洒. 但是我还是要学react-native,不要问我为什么,因为我相信一门解决了原生app,开发周期长,开发成本高,升级代价大的语言一定会 ...

  4. (转载)SQL Server2008附加数据库之后显示为只读时解决方法

    SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定 ...

  5. Linux下的tree命令 --Linux下目录树查看

    Linux下的tree命令 --Linux下目录树查看 有时我们需要生成目录树结构,可以使用的有ls -R,但是实际效果并不好 这时需要用到tree命令,但是大部分Linux系统是默认不安装该命令的, ...

  6. App Store10大被拒理由

    最近,苹果在官网给出了截至2015年2月份应用被拒绝的十大理由,其中50%以上的应用被拒绝都是因为这10个原因,其中7个理由和2014年相同,其中排名前三的原因分别是:需要补充更多信息.存在明显的bu ...

  7. Ajax 模糊查询的简单实现

    类似于百度的搜索引擎模糊查询功能,不过百度的模糊查询功能更强大,这里简单实现下. 要实现模糊查询,首先要做的就是把SQL写好.话不多少,直接贴代码了! JSP页面: <%@ page langu ...

  8. 恶补web之六:javascript知识(2)

    若要向html添加新元素,必须首先创建该元素,然后向一个已存在的元素追加该元素 <div id="div1"> <p id="p1">这 ...

  9. Validate Binary Search Tree(一定掌握的方法)

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  10. 4 sum

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...