CountDownLatch 介绍

CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数器。如果调用对象上的await()方法,调用者就会一直阻塞,直到别人调用countDown方法,将计数减到0,才可以继续执行。

CountDownLatch可以避免等待队列,它可以让代码执行效率更高一些。

代码实例

final CountDownLatch latch = new CountDownLatch(1); //定义一个门闩(计数器),一旦定义,不可变。

门闩常用方法:

latch.await();                        等待门闩的开放,不是进入等待队列。

latch.countDown();               调用此方法,门闩减一

以一个案例讲解CountDownLatch门闩

要求:定义一个容器,该容器最大限度为10,当容器元素添加到第5个的时候,打印容器大小。

代码:

/*** CountDownLatch 门闩*/
package concurrent.t02;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class Test_03 {public static void main(String[] args) {final Test_03_Container t = new Test_03_Container();final CountDownLatch latch = new CountDownLatch(1);new Thread(new Runnable(){@Overridepublic void run() {if(t.size() != 5){try {latch.await(); // 等待门闩的开放。 不是进入等待队列} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("size = 5");}}).start();new Thread(new Runnable() {@Overridepublic void run() {for(int i = 0; i < 10; i++){System.out.println("add Object to Container " + i);t.add(new Object());if(t.size() == 5){latch.countDown(); // 门闩-1}try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}}}}).start();}
}class Test_03_Container{List<Object> container = new ArrayList<>();public void add(Object o){this.container.add(o);}public int size(){return this.container.size();}
}

门闩应用场景:马拉松比赛

CountDownLatch 门闩 实例详解相关推荐

  1. java异常例子_java 异常的实例详解

    java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...

  2. python 自动化办公 案例_python自动化工具之pywinauto实例详解

    python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...

  3. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

  4. python多进程应用场景_python使用多进程的实例详解

    python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...

  5. php可以打印一个页面,利用html实现分页打印功能的实例详解

    本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...

  6. python判断是否回文_对python判断是否回文数的实例详解

    设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...

  7. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  8. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

  9. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

最新文章

  1. 0x07.基本算法 — 贪心
  2. Feature Schema中Module和File节点属性含义的解释
  3. 离开当前屏幕的判断方法_EXCEL 一个工作表如何快速拆分多个工作表的方法
  4. 如何查看mysql my.ini_MySQL学习笔记(一)
  5. C++ 学习基础篇(一)—— C++与C 的区别
  6. “睡服”面试官系列第十一篇之module加载实现(建议收藏学习)
  7. form提交php怎么接收不到,php form表单post提交获取不到数据,而使用get提交能获取到数据 的解决办法...
  8. signature=12e3283d637b587235bcb4cbbfa1a5b3,A pathogen-inducible endogenous siRNA in plant immunity
  9. mvc ajax图片上传,MVC 通过ajaxSubmit上传图片并显示
  10. Android TabLayout和ViewPager
  11. h5网页小游戏php源码,H5 组词小游戏源代码
  12. 003:枚举算法(习题)
  13. Apache虚拟主机配置详细教程
  14. 墨菲定律([美]阿瑟·布洛芬:山西人民出版社 2012)pdf格式下载
  15. C# 基础 (3) 垃圾回收机制(Garbage Collector)
  16. 云服务器转租赁协议,云服务器转租赁协议
  17. 阿里云Centos6数据盘扩容的问题处理
  18. 使用CLion开发STM32时无法生成hex文件的解决办法
  19. UVA10158 - War(并查集)
  20. 打电话降噪蓝牙耳机推荐,适合通勤使用的降噪蓝牙耳机分享

热门文章

  1. FileProvider 的使用(Failed to find configured root that contains/storage/emulated/0/DCIM/ )
  2. MySQL之查看表占用空间大小
  3. 实例说明MongoDB存储的行情数据如何选择合适的Shard Key
  4. 河海哥上岸了,HoHai University 专硕,电子信息。
  5. python 网络爬虫 1.2 获取豆瓣TOP250电影的中英文名、港台名、导演、上映年份、电影分类以及评分,将数据存入文档。
  6. JavaScript基础(一)(编程语言,计算机基础,初始JavaScript,JavaScript注释,输入输出语句,变量的概念,变量的使用,数据类型,解释型语言和编译型语言)
  7. 量化交易入门阶段——MACD配合探底回升因子测试(上)
  8. three.js顶点颜色插值THREE.VertexColors无效
  9. 微信网页开发之缓存问题
  10. 计算机毕业论文内容参考|基于Python的互联网金融产品交易平台的设计与实现