当前位置: 首页 > news >正文

线程同步辅助类——CountDownLatch

为什么80%的码农都做不了架构师?>>>   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

相关文章:

  • Java中的并发工具
  • ShareSDK的使用文章
  • Linux查看程序端口占用情况
  • 如何在VS2008中自定义多项目模板
  • 程序员,我们都是夜归人【转】
  • 【架构】微服务系列文章
  • 快速查询Python脚本语法
  • 基础业务集成开发平台(BusinessWorks) - 概要设计篇
  • java基础----java调用oracle存储过程(转)
  • linux GTK 安装
  • 如果在ecshop中自定义添加模板
  • Python操作MySQL数据库
  • Java中的内部接口
  • linux gcc 编译动态类库(.so)和静态类库(.a)
  • jQuery学习和知识点总结归纳
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2017-09-12 前端日报
  • canvas 绘制双线技巧
  • ES10 特性的完整指南
  • go语言学习初探(一)
  • Hibernate【inverse和cascade属性】知识要点
  • Netty源码解析1-Buffer
  • node学习系列之简单文件上传
  • PHP面试之三:MySQL数据库
  • python 装饰器(一)
  • Python爬虫--- 1.3 BS4库的解析器
  • windows下如何用phpstorm同步测试服务器
  • 检测对象或数组
  • 开源地图数据可视化库——mapnik
  • 看域名解析域名安全对SEO的影响
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (独孤九剑)--文件系统
  • (二)丶RabbitMQ的六大核心
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原)Matlab的svmtrain和svmclassify
  • (转) Face-Resources
  • (转)visual stdio 书签功能介绍
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net MVC4 上传大文件,并保存表单
  • /usr/bin/env: node: No such file or directory
  • @RequestBody与@ResponseBody的使用
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [100天算法】-x 的平方根(day 61)
  • [autojs]逍遥模拟器和vscode对接