CountDownLatch的简单使用
from https://www.jianshu.com/p/cef6243cdfd9
1.CountDownLatch是什么?
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。
典型的用法是将一个程序分为n个互相独立的可解决任务,并创建值为n的CountDownLatch。当每一个任务完成时,都会在这个锁存器上调用countDown,等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。
2.一个简单的例子
在主线程中,开5个子线程来执行20个任务,只有等任务全部完成后,主线程才能再去做其它事。
测试代码:
public class CountDownLatchTest {
private int threadNum = 5;//执行任务的子线程数量
private int workNum = 20;//任务数量
private ExecutorService service;
private ArrayBlockingQueue<String> blockingQueue;
private CountDownLatch latch;
@Before
public void setUp() {
service = Executors.newFixedThreadPool(threadNum, new ThreadFactoryBuilder().setNameFormat("WorkThread-%d").build());
blockingQueue = new ArrayBlockingQueue<>(workNum);
for (int i = 0; i < workNum; i++) {
blockingQueue.add("任务-" + i);
}
latch = new CountDownLatch(workNum);//计数器的值为任务的数量
}
@Test
public void test() throws InterruptedException {
SoutUtil.print("主线程开始运行");
for (int i = 0; i < workNum; i++) {
service.execute(new WorkRunnable());
}
latch.await();//等待子线程的所有任务完成
SoutUtil.print("主线程去做其它事");
}
//用blockQueue中的元素模拟任务
public String getWork() {
return blockingQueue.poll();
}
class WorkRunnable implements Runnable {
public void run() {
String work = getWork();
performWork(work);
latch.countDown();//完成一个任务就调用一次
}
}
private void performWork(String work) {
SoutUtil.print("处理任务:" + work);
try {
//模拟耗时的任务
Thread.currentThread().sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果为:
2016/12/09 22:23:02.860 main (CountDownLatchTest.java:36).test: 主线程开始运行
2016/12/09 22:23:02.862 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-0
2016/12/09 22:23:02.862 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-1
2016/12/09 22:23:02.862 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-2
2016/12/09 22:23:02.862 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-3
2016/12/09 22:23:02.863 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-4
2016/12/09 22:23:02.926 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-7
2016/12/09 22:23:02.926 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-5
2016/12/09 22:23:02.926 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-8
2016/12/09 22:23:02.926 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-6
2016/12/09 22:23:02.926 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-9
2016/12/09 22:23:02.992 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-11
2016/12/09 22:23:02.992 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-12
2016/12/09 22:23:02.992 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-13
2016/12/09 22:23:02.992 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-14
2016/12/09 22:23:02.992 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-10
2016/12/09 22:23:03.057 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-16
2016/12/09 22:23:03.057 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-18
2016/12/09 22:23:03.057 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-15
2016/12/09 22:23:03.057 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-17
2016/12/09 22:23:03.057 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-19
2016/12/09 22:23:03.120 main (CountDownLatchTest.java:41).test: 主线程去做其它事
参考目录:
作者:天然鱼
链接:https://www.jianshu.com/p/cef6243cdfd9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
CountDownLatch的简单使用的更多相关文章
- CountDownLatch的简单讲解
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- CountDownLatch的简单理解
CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用). CountDownLatch能够使一个 ...
- CountDownLatch的简单实现
1. @Data public abstract class BaseLatch { private int limit; protected int running; BaseLatch(int l ...
- JAVA中CountDownLatch的简单示例
public static void main(String[] args) throws InterruptedException { CountDownLatch latch =new Count ...
- CountDownLatch的原理学习
转载:http://blog.csdn.net/yanyan19880509/article/details/52349056 前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过Co ...
- CountDownLatch 和 CyclicBarrier 的运用及实现原理
I.CountDownLatch 和 CyclicBarrier 的运用 CountDownlatch: 定义: 其是一个线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所 ...
- java共享锁实现原理及CountDownLatch解析
前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过CountDownLatch的学习来了解java并发包中是如何实现共享锁的. CountDownLatch使用解说 CountDow ...
- java高级---->Thread之CountDownLatch的使用
CountDownLatch是JDK 5+里面闭锁的一个实现,允许一个或者多个线程等待某个事件的发生.今天我们通过一些实例来学习一下它的用法. CountDownLatch的简单使用 CountDow ...
- Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒
java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
随机推荐
- JMeter元件的作用域与执行顺序
元件的作用域 先来讨论一下元件有作用域.<JMeter基础元件介绍>一节中,我们介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器 是典型的不与其它元件发生交互作用 ...
- EntityManager对象管理
根据EntityManager对象的管理方式,可以有以下两种类型: — 容器托管的(container-managed)EntityManager对象 容器托管的EntityManager对象最简单, ...
- Linux定时增量更新文件--转
http://my.oschina.net/immk/blog/193926 动机与需求:现在有两台服务器A和B,由于A的存储随时会挂(某些原因),所以需要B机器上有A的备份,并且能够与A同步更新 一 ...
- 面向对象 OOP
[面向对象编程OOP] 1 语言的分类 面向机器 :汇编语言 面向过程 :c语言 面向对象 :c++ Java PHP等 2 面向过程与面向对象 面向过程:专注于如何去解决一个问题的过程,编程 ...
- nodejs中引入art-template模板
使用Webstorm创建nodejs express应用时,默认使用的是jade或者ejs模板,对于不习惯这两种模板语法的人来说确实不是很方便.没关系,这里我们使用art-template模板引擎,使 ...
- svn在commit后报错:is scheduled for addition, but is missing
今天通过svn 的cr(code review)代码审核后,我欲执行svn ci -m"xxxxxxx(提交注释) ISSUE=3380305",但是没有提交成功,SVN报错啦! ...
- 移动端Push推送
移动端Push推送 移动端开发逃不掉要做推送,这里给出服务端一种省时省力的解决方案. iOS:PushSharp.Apple.苹果有自己的推送服务,我们按照规则推送数据就好.这里我选取PushShar ...
- 从Java虚拟机角度分析类的实例化顺序
1.首先展示一下实例代码(Son.java & Father.java) public class Father { public static int a=10;//父类的静态变量 stat ...
- flask之wtforms 表单验证(一)
一 安装wtforms pip install wtforms 二 导入相关模块及对象 from wtforms import Form, widgets, validators from wtf ...
- 从官网下载mod_jk.so
最近在搞apache和tomcat集群,这里就要用到mol_jk.so,在官网找了很久才知道在哪里下载,英语是硬伤啊. 1.打开tomcat官网 http://tomcat.apache.org/ 2 ...