并发编程工具之一:CountDownLatch 用法

简介: CountDownLatch 用法CountDownLatch是java.util.concurrent包中一个类,CountDownLatch只要提供的机制是多个(具体数量等于初始化CountDownLatch时count的值)线程都达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作。

CountDownLatch 用法
CountDownLatch是java.util.concurrent包中一个类,CountDownLatch只要提供的机制是多个(具体数量等于初始化CountDownLatch时count的值)线程都达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作。等待的线程可以是多个,即CountDownLatch可以唤醒多个等待的线程。到达自己预期状态的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法。

每次调用countDown方法时,计数都会减1,直到0为止,此时因调用await方法的阻塞线程被唤醒

代码例子:

public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDown = new CountDownLatch(1);
        CountDownLatch await = new CountDownLatch(5);
 
        // 依次创建并启动处于等待状态的5个MyRunnable线程
        for (int i = 0; i < 5; ++i) {
            new Thread(new MyRunnable(countDown, await)).start();
        }
 
        System.out.println("用于触发处于等待状态的线程开始工作......");
        System.out.println("用于触发处于等待状态的线程工作完成,等待状态线程开始工作......");
        countDown.countDown();
        await.await();
        System.out.println("Bingo!");
}
 
public class MyRunnable implements Runnable {
 
    private final CountDownLatch countDown;
    private final CountDownLatch await;
 
    public MyRunnable(CountDownLatch countDown, CountDownLatch await) {
        this.countDown = countDown;
        this.await = await;
    }
 
    public void run() {
        try {
            countDown.await();//等待主线程执行完毕,获得开始执行信号...
            System.out.println("处于等待的线程开始自己预期工作......");
            await.countDown();//完成预期工作,发出完成信号...
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
运行结果:
用于触发处于等待状态的线程开始工作......
用于触发处于等待状态的线程工作完成,等待状态线程开始工作......
处于等待的线程开始自己预期工作......
处于等待的线程开始自己预期工作......
处于等待的线程开始自己预期工作......
处于等待的线程开始自己预期工作......
处于等待的线程开始自己预期工作......

Bingo!
目录
相关文章
|
数据采集 运维 测试技术
软件测试之道 -- 做一个有匠心的程序员
作者一年前围绕设计模式与代码重构写了一篇《代码整洁之道 -- 告别码农,做一个有思想的程序员!》的文章。本文作为续篇,从测试角度谈程序员对软件质量的追求。
344 16
|
存储 编解码 网络协议
阿里云目前活动中各实例规格性能、指标数据、适用场景及选择参考
很多新手用户初次通过阿里云各种活动购买云服务器的时候,面对各种不同的实例规格,往往不知道应该怎么选,目前在阿里云的活动中,除了轻量应用服务器之外,活动内的云服务器实例规格主要以经济型e、通用算力型u1、计算型c7/c8y、通用型g7/g8y、内存型r7/r8y这几个实例规格为主,不同的云服务器实例规格在性能特点、适用场景等方面均有所差异。本文将详细介绍阿里云目前活动中常见的实例规格及其性能特点、适用场景,帮助用户更好地选择适合自己的云服务器配置。
阿里云目前活动中各实例规格性能、指标数据、适用场景及选择参考
|
XML Java 数据格式
Spring-AOP简介、核心概念、入门案例及工作流程
Spring-AOP简介、核心概念、入门案例及工作流程
270 0
|
JSON Android开发 数据格式
Android Gson的使用总结
1、概念 Gson是谷歌发布的一个json解析框架 2、如何获取     github:https://github.com/google/gson     android studio使用 compile 'com.
1697 0
|
关系型数据库 PostgreSQL 移动开发
PostgreSQL 9.6 聚合运算180倍性能提升如何做到? 聚合代码优化OP复用浅析
PostgreSQL 9.6 内核优化之 聚合代码优化OP复用浅析 作者 digoal 日期 2016-10-08 标签 PostgreSQL , 9.6 , 内核优化 , 聚合代码优化 , OP复用 背景 聚合操作指将分组的数据聚合为一个结果输出。 聚合通常用在统
5572 0
|
自然语言处理 数据挖掘 Unix
R 语言是什么、R 的优势、资源|学习笔记
快速学习 R 语言是什么、R 的优势、资源。
378 1
R 语言是什么、R 的优势、资源|学习笔记
|
开发者
产品生命周期 | 学习笔记
快速学习产品生命周期。
984 0
产品生命周期 | 学习笔记
|
JSON 编解码 前端开发
阿里低代码引擎和生态建设实战及思考
阿里低代码引擎和生态建设实战及思考
3867 0
阿里低代码引擎和生态建设实战及思考
|
数据采集 数据可视化 算法
智能电表数据上传阿里云
本文将以诺派智能电表作为采集对象,使用海创微联采集控制系统对电表数据进行采集,然后将采集数据上传至阿里云物联网平台,实现实时数据可视化。
1502 1
智能电表数据上传阿里云
|
Java 5G 开发工具
鸿蒙系统开发工具DevEco Studio 2.2下载/安装教程
鸿蒙开发包括鸿蒙应用开发(手机app)和鸿蒙设备开发(硬件开发)两大部分,其中设备开发又包括TV,音响,眼镜,手表,PC,平板,汽车,耳机以及未来的各种智能家居,手机作为一个超级终端,与各种设备实现互联,未来无论是在工作,学习,运动还是做家务,都会用到鸿蒙系统
679 1
鸿蒙系统开发工具DevEco Studio 2.2下载/安装教程