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包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
 
随机推荐
- android LinearLayoutForListView
			
由于 scrollview 套 listview 会有很多问题,网上很多人用 LinearLayout 模拟 listview, 也可以设置 adapter. 很多人直接继承 BaseAdapter, ...
 - jreble安装 in idea
			
http://www.cnblogs.com/littlehb/archive/2013/04/19/3031045.html
 - hadoop Shell命令详解
			
调用文件系统(FS)Shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI路径详解点击这里. 1.cat说明:将路径 ...
 - [转]使用依赖关系注入在 ASP.NET Core 中编写干净代码
			
本文转自:http://blog.jobbole.com/101270/ 原文出处: Steve Smith ASP.NET Core 1.0 是 ASP.NET 的完全重新编写,这个新框架的主 ...
 - 创建WPF用户控件
			
wpf用户自定义控件和winform创建方法类似,这里先纠正一个误区,就是有很多人也是添加,然后新建,然后是新建用户控件库,但是为什么编译好生成后Debug目录下还是只有exe文件而没有dll文件呢? ...
 - Map常用集合遍历
			
Map集合遍历的四种方式理解和简单使用 Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1:无非就是通过map.keySet()获取到值,然后根据键 ...
 - mongodb-mms安装
			
mms是mongo集群监控软件. mms非常吃内存,虚拟机测试时,3G内存启动成功一次,之后重启时失败,建议不少于4G内存. MMS下载地址: https://downloads.mongodb.co ...
 - Android xmlns 的作用及其自定义
			
转自:http://blog.csdn.net/chuchu521/article/details/8052855 xmlns:Android="http://schemas.android ...
 - Spring 中的scope
			
scope有Singleton.Prototype.request.session.global session.其中主要的是singleton和prototype. singleton指的是IOC容 ...
 - element中文件上传
			
vue+element 文件操作 作者:一粒尘土 时间:2019-3-17 注:以下操作针对 vue-cli 目录 使用 组件常用参数 组件常用方法 上传文件 上传文件格式限制 回显文件 下载文件 删 ...