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等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
随机推荐
- CentOS 6.X启动流程
CentOS 6.X启动流程 /boot分区 启动引导程序是默认可以识别boot分区的.因此在系统还无法加载硬盘的时候,boot分区是可以识别的! initramfs内存文件系统 CentOS 6.x ...
- PS 滤镜算法原理——照亮边缘
这个算法原理很简单,对彩色图像的R,G,B 三个通道,分别求梯度,然后将梯度值作为三个通道的值. clc; clear all;Image=imread('4.jpg');Image=double(I ...
- DB Query Analyzer 6.01 is released, SQL Execute Schedule function can be used
DB Query Analyzer is presented by Master Gen feng, Ma from Chinese Mainland. It has English versi ...
- LeetCode(50)-Word Pattern
题目: Given a pattern and a string str, find if str follows the same pattern. Here follow means a full ...
- obj-c编程16:键值编码(KVC)
我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存取器方法来获取或设置类的属性.下面的例子,借助于K ...
- windows from 手风琴
public class OutlookBar : Panel { private int SelectedBandHeight { get; set; } public int ButtonHeig ...
- log4j日志的配置
在项目开发中,记录错误日志方便调试.便于发现系统运行过程中的错误.便于后期分析, 在java中,记录日志有很多种方式,比如说log4j log4j需要导入的包: commons-loggin.jar ...
- python笔记--2--字符串、正则表达式
字符串 ASCII码采用1个字节来对字符进行编码,最多只能表示256个符号. UTF-8以3个字节表示中文 GB2312是我国制定的中文编码,使用1个字节表示英语,2个字节表示中文:GBK是GB231 ...
- 使用swagger管理接口
swagger 配置 1.pom 增加jar包依赖 <dependency> <groupId>io.springfox</groupId> <artifac ...
- 在SQL Server 2008 Management Studio中修改表字段顺序
有时我们可能需要为一个已存在的数据库表添加字段,并且想让这个字段默认排的靠前一些,这时就需要为表字段重新进行排序,默认情况下在Management Studio中调整顺序并保存时会提示"不允 ...