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包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
随机推荐
- Objective-C中.h、.m、.mm的区别
.h :头文件.头文件包含类,类型,函数和常数的声明. .m :源代码文件.这是典型的源代码文件扩展名,可以包含Objective-C和C代码. .mm :源代码文件.带有这种扩展名的源代码文件, ...
- lua默认是double类型
把c#的float类型传给lua ,lua自己换转成double ,一转就出精度问题 lua只有double没有float ===================================== ...
- 我java学习时的模样(一)
学会敲键盘,能够实现盲打 程序员写代码,是通过键盘将程序输入到编辑器中,而码子的高效,能够让自己的思路更流畅一些.如果想从事IT工作,那面打字就必须得会,并且,如果还一个一个字母去找,上司就会认为是一 ...
- PHP根据ASCII码返回具体的字符
根据ASCII码返回具体的字符,在php中可以使用函数 chr(); 如:大写字母A的 ASCII码是 65, 所以: <?php echo chr(65);//结果是大写字母 A ?> ...
- Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
一.配置Oracle instantClient 11.2.0.4 1.下载Oracle客户端: 打开http://www.oracle.com/technetwork/topics/linuxx86 ...
- WEB项目构建优化之自动清除CSS中的图片缓存
在web项目构建发布时,经常遇到css中图片的修改优化,那么如何清除图片的缓存成为必须要解决的问题.曾经有过傻傻的方法就是直接在图片后面添加随机数.今天主要是从构建自动化方式来解决这个问题,提高开发及 ...
- 另一个C#模拟post请求的例子
private string returninstallTmnl(AddTmnlInstallParameter model) { string url = ConfigurationSettings ...
- axios发送post请求后台接受不到问题
axios发送post请求后台接受不到问题 1.首先这是前端的问题 2.解决方案不唯一,但这招肯定行 <!DOCTYPE html> <html> <head> & ...
- MDI-设置子窗体只能弹出一个--单例模式
不足之处,欢迎指正! 什么是MDI..我表示不知道的呢. MDI(Multiple Document Interface)就是所谓的多文档界面,与此对应就有单文档界面 (SDI), 它是微软公司从Wi ...
- [转]ubuntu 13.04 体验wine qq
1.首先安装最新版的wine1.52,没记错版本号应该是这个 sudo add-apt-repository ppa:ubuntu-wine/ppa sudo apt-get update sudo ...