博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步辅助类——CountDownLatch
阅读量:7080 次
发布时间:2019-06-28

本文共 1830 字,大约阅读时间需要 6 分钟。

  hot3.png

CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它运行一个或者多个线程一直处于等待状态。

CountDownLatch中有两个关键的方法

public void countDown() {}

public boolean await(long timeout, TimeUnit unit){}

CountDownLatch是一个计数器,在它的构造方法中需要指定一个值,用来设定计数的次数。

每调用一次countDown()方法,数值便会减一,CountDownLatch会一直阻塞着调用await()方法的线程

直到计数器的值变为0。

设想有这样一个功能需要Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F

四个盘的大小,所有线程都统计完毕交给主线程去做汇总,利用CountDownLatch来完成就非常轻松。

package com.dreyer.javadoc.thread;import java.util.Date;import java.util.Random;import java.util.concurrent.*;/** * @description CountDownLatch * @author: Dreyer * @date: 16/5/14 下午11:41 */public class CountDownLatchDemo {    /**     *     */    private static CountDownLatch countDownLatch = new CountDownLatch(4);    /**     * 线程池     */    private static ExecutorService executor = Executors.newFixedThreadPool(4);    /**     * 开启的线程数     */    private static int THREAD_COUNT = 4;    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < THREAD_COUNT; i++) {            executor.execute(new Runnable() {                public void run() {                    try {                        // 模拟业务逻辑的耗时                        int timer = new Random().nextInt(5);                        TimeUnit.SECONDS.sleep(timer);                        System.out.printf("%s时完成磁盘的统计任务,耗费%d秒.\n", new Date().toString(), timer);                        // 业务处理完成之后,计数器减一                        countDownLatch.countDown();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            });        }        // 主线程一直被阻塞,直到countDownLatch的值为0        countDownLatch.await();        System.out.printf("%s时全部任务都完成,执行合并计算.\n", new Date().toString());        executor.shutdown();    }}

 

转载于:https://my.oschina.net/dreyer/blog/675247

你可能感兴趣的文章
linux 下使用mydns以及powerdns
查看>>
quartz - 集群调度机制调研及源码分析
查看>>
Cover3.0常用弹出层逻辑封装
查看>>
微信小程序web-view使用整理
查看>>
Oracle等待事件
查看>>
虚拟机与主机通信设置工作记录20130607
查看>>
一个系统中安装多个mysql数据库的方法,以及mysql数据库自动备份脚本的编写
查看>>
ceph 指定OSD创建pool
查看>>
如何给Map/Reduce程序传递参数?
查看>>
Java Socket编程----通信是这样炼成的
查看>>
ping得通域名,但是打不开网站,怎么回事呢?
查看>>
【西藏攻略+游记】十一,我们去西藏(3)拉萨
查看>>
如何用js来判断浏览器类型(ie,firefox)
查看>>
工作上的几点建议
查看>>
我的友情链接
查看>>
smali反编译dex
查看>>
Lync Server 2010安装笔记之七—存档服务器部署记录
查看>>
iphone app 发布
查看>>
elasticsearch 插件
查看>>
maven 打包
查看>>