Java并发之CountDownLatch工具类
一、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工具类的更多相关文章
- Java并发之CyclicBarrier工具类
一.CyclicBarrier工具类介绍 在上一篇文中我们介绍到了CountDownLatch工具类,其实CyclicBarrier和CountDownLatch工具类实现的功能差不多.我们可以从字面 ...
- Java并发之同步工具类
1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...
- Java并发多线程 - 并发工具类JUC
安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...
- Java并发之CountDownLatch的使用
Java并发之CountDownLatch的使用 一. 简介 Java的并发包早在JDK5这个版本中就已经推出,而且Java的并发编程是几乎每个Java程序员都无法绕开的屏障.笔者今晚在家闲来无事,翻 ...
- Java 中的并发工具类
Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...
- Java线程的并发工具类
Java线程的并发工具类. 一.fork/join 1. Fork-Join原理 在必要的情况下,将一个大任务,拆分(fork)成若干个小任务,然后再将一个个小任务的结果进行汇总(join). 适用场 ...
- Rhino+envjs-1.2.js 在java运行网站js 工具类
java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- Java学习-041-颜色工具类(RGB,HEX)
在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
随机推荐
- android放大镜效果实现
概述 我相信很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView ex ...
- 【翻译】Ext JS最新技巧——2014-9-10
原文:Top Support Tips Greg Barry:删除网格单元格的焦点 在Ext JS 5.0.1,添加了一些与可访问性和支持ARIA有关的显著改进.虽然鼓励使用这些新增功能,但默认样式可 ...
- 如何让你的传输更安全--基于SSL协议的通信模式
之前发表在另一个平台的文章http://www.jointforce.com/jfperiodical/article/1218,现在发表到自己的博客上. 对于SSL/TLS协议,如果要每个开发者都自 ...
- 【一天一道LeetCode】#40. Combination Sum II
一天一道LeetCode系列 (一)题目 Given a collection of candidate numbers (C) and a target number (T), find all u ...
- Palette状态栏颜色提取,写的不错就分享了
Palette 说Palette之前先说下前面提到的Pager.ViewPager是什么大家应该都是知道的了,一般ViewPager.xxxTabStrip.Fragment三个好基友是一起出现的.这 ...
- TCP的核心系列 — 重传队列的更新和时延的采样(二)
在tcp_clean_rtx_queue()中,并非对每个ACK都进行时延采样.是否进行时延采样,跟这个ACK是否为 重复的ACK.这个ACK是否确认了重传包,以及是否使用时间戳选项都有关系. 本文主 ...
- 基于Oracle ADF的应用程序开发
ADF简介 ADF(Application Development Framework)是Oracle公司为简化J2EE程序开发的复杂性专门开发的一种解决方案,ADF通过减少实现设计模式和应用程序框架 ...
- ngnix服务器搭建
1. 到nginx官网上下载相应的安装包,http://nginx.org/en/download.html:下载进行解压,将解压后的文件放到自己心仪的目录下,我的解压文件放在了d盘根目录下,如下图 ...
- 苹果新的编程语言 Swift 语言进阶(十)--类的继承
一.类的继承 类能够从其它类继承方法.属性以及其它特性,当一个类从另外的类继承时,继承的类称为子类,它继承的类称为超类.在Swift中,继承是类区别与其它类型(结构.枚举)的基础行为. 1.1 .类的 ...
- 11个超棒的iOS开发学习网站
原文:11 Insanely Great iOS Developers Sites 永不止步地向他人学习 我相信,要想从一个"还不错"的人变成一个卓越的人,我们需要不停地向他人学习 ...