一、概念

  闭锁是一个同步工具类,主要用于等待其他线程活动结束后,再执行后续的操作。例如:在王者荣耀游戏中,需要10名玩家都准备就绪后,游戏才能开始。

  CountDownLatch是concurrent包中的一个类,是一种灵活的闭锁实现。他可以使一个或多个线程等待一组事件的发生。闭锁状态包括一个计数器,表示需要等待的数量。

  countDown方法是递减计数器,表示一个事件已经发生。await方法等待计数器为0,表示所有事件都已经发生。如果计数器值大于0,await会一直阻塞,等待计数器为0。

二、CountDownLatch用法

public static void main(String[] args) throws InterruptedException {
     //开始闭锁(1个事件)
CountDownLatch startCdl = new CountDownLatch(1);
     //结束闭锁(10个事件)
CountDownLatch endCdl = new CountDownLatch(10);
     //固定线程池(10个线程)
ExecutorService es = Executors.newFixedThreadPool(10);
for (int i=0;i<10;i++){
es.execute(()->{
try {
            //等待开始闭锁
startCdl.await();
            //休眠5秒
Thread.sleep(5*1000);
System.out.println(Thread.currentThread().getName());
            //结束闭锁 计数器减1
endCdl.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
     //线程池关闭
es.shutdown();
long start = System.currentTimeMillis();
     //开始闭锁 计数器减1 计数器值为0
startCdl.countDown();
     //等待结束闭锁 10个线程结束后 计数器值为0, 执行或许操作
endCdl.await();
long end = System.currentTimeMillis();
System.out.println("运行时间为:"+(end-start));
}

  在这里,我们设置“开始闭锁”是为了10个线程能够同时执行,如果没有“开始闭锁”,那么在循环时,前面的线程会先执行。设置“开始闭锁”以后,10个线程均在await方法等待。当“开始闭锁”执行countDown方法时,计时器为0,10个线程的await方法同时释放,执行后续操作。随后主线程“结束闭锁”进行await等待,由于“结束闭锁”的计数器值为10,所以10个线程都执行countDown以后,计数器值才为0,这时“结束闭锁”await方法释放,执行以下操作。计算出10个任务同时执行所需要的时间。

博主原创,转载请联系博主

闭锁——CountDownLatch的更多相关文章

  1. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  2. Java并发编程原理与实战二十六:闭锁 CountDownLatch

    关于闭锁 CountDownLatch 之前在网上看到过一篇举例非常形象的例子,但不记得是出自哪里了,所以这里就当自己再重新写一篇吧: 例子如下: 我们每天起早贪黑的上班,父母每天也要上班,有一天定了 ...

  3. 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)

    此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...

  4. 闭锁CountDownLatch与栅栏CyclicBarrier

    https://blog.csdn.net/lmc_wy/article/details/7866863   闭锁CountDownLatch与栅栏CyclicBarrier     浅谈 java ...

  5. 4.闭锁 CountDownLatch

    /*CountDownLatch 闭锁*/ CountDownLatch 是一各同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 闭锁可以延迟线程的进度 直到 其到达终 ...

  6. 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)[转]

    此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...

  7. Java并发编程之闭锁CountDownLatch简单介绍

    闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时.这扇门才会打开并容许全部线程通过.它能够使一个或多个线程等待一组事件发生. 闭锁状态包含一个 ...

  8. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

  9. 多线程-闭锁CountDownLatch

    闭锁相当于相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关着的,所有的线程都不可以通过.它可以使一个或者一组线程等待某个时间发生.闭锁状态包括一个计数器,初始化的时候传入一个正数,这个数字表示等待 ...

随机推荐

  1. RabbitMQ 使用场景一

    安装环境 1.下载安装 Erlang 运行时环境 2.下载安装 RabbitMQ Server 应用程序 3.启动 RabbitMQ 服务(默认启动) 4.安装管理平台插件并打开远程访问权限 4.1. ...

  2. html、js、django处理日期问题

    在html中使用日期控件,利用ngmodel将输入的值传到js里: <input type="date" ng-model="timeOps.test.a_time ...

  3. js数组遍历和对象遍历

    针对js各种遍历作一个总结分析,从类型用处:分数组遍历和对象遍历:还有性能,优缺点等. JS数组遍历: 1,普通for循环,经常用的数组遍历 var arr = [1,2,0,3,9]; for ( ...

  4. 一种更高查询性能的列存储方式MaxMinT 第一部分

    简介本文描述了一种列存储方式和对应的查询方法,这种存储方式具有更好的查询性能和更小的存储空间. And查询 本文先用直观的图形方式展示and查询时的方式,这也是算法要解决的问题核心.通常在OLAP数据 ...

  5. Exceptionless 本地部署踩坑记录

    仅已此文记录 Exceptionless 本地部署所遇到的问题 1.安装ElasticSearch文本 执行elasticsearch目录中的elasticsearch.bat 没有执行成功. 使用命 ...

  6. 设计模式(3)--FactoryMethod( [2] 工厂方法模式)--创建型

    1.模式定义: 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 2.模式特点: (1)工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承. (2 ...

  7. C++新建Dialog程序

    1.新建: IDE VS2013 新建项目|C++|MFC,选择“基于对话框” 2.为Dialog添加类 在Dialog(界面)上右键,选择“添加类”,然后再弹出界面输入类名即可. 为什么要添加类? ...

  8. SSH服务(一)

    一.初始SSH SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的 ...

  9. Linux环境下安装禅道

      1.下载禅道包 http://dl.cnezsoft.com/zentao/7.3/ZenTaoPMS.7.3.stable.zbox_64.tar.gz http://dl.cnezsoft.c ...

  10. How to customize the console applicaton

    下面是如何最大化console和改变其显示的字体颜色的代码,顺便包含了计时代码(帮助做性能分析): class Program { [DllImport("kernel32.dll" ...