CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

主要方法

public CountDownLatch(int count);

public void countDown();

public void await() throws InterruptedException

构造方法参数指定了计数的次数

countDown方法,当前线程调用此方法,则计数减一

awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

例子:

public class CountDownLatchDemo {  final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  public static void main(String[] args) throws InterruptedException {  CountDownLatch latch=new CountDownLatch(2);//两个工人的协作  Worker worker1=new Worker("zhang san", 5000, latch);  Worker worker2=new Worker("li si", 8000, latch);  worker1.start();//  worker2.start();//  latch.await();//等待所有工人完成工作  System.out.println("all work done at "+sdf.format(new Date()));  }  static class Worker extends Thread{  String workerName;   int workTime;  CountDownLatch latch;  public Worker(String workerName ,int workTime ,CountDownLatch latch){  this.workerName=workerName;  this.workTime=workTime;  this.latch=latch;  }  public void run(){  System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));  doWork();//工作了  System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));  latch.countDown();//工人完成工作,计数器减一
  }  private void doWork(){  try {  Thread.sleep(workTime);  } catch (InterruptedException e) {  e.printStackTrace();  }  }  }  }  

输出:

Worker zhang san do work begin at 2011-04-14 11:05:11
Worker li si do work begin at 2011-04-14 11:05:11
Worker zhang san do work complete at 2011-04-14 11:05:16
Worker li si do work complete at 2011-04-14 11:05:19
all work done at 2011-04-14 11:05:19

CountDownLatch类有3个基本元素:

  1. 初始值决定CountDownLatch类需要等待的事件的数量。
  2. await() 方法, 被等待全部事件终结的线程调用。
  3. countDown() 方法,事件在结束执行后调用。

当创建 CountDownLatch 对象时,对象使用构造函数的参数来初始化内部计数器。每次调用 countDown() 方法, CountDownLatch 对象内部计数器减一。当内部计数器达到0时, CountDownLatch 对象唤醒全部使用 await() 方法睡眠的线程们。

不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一旦计数器的值初始后,唯一可以修改它的方法就是之前用的 countDown() 方法。当计数器到达0时, 全部调用 await() 方法会立刻返回,接下来任何countDown() 方法的调用都将不会造成任何影响。

此方法与其他同步方法有这些不同:

CountDownLatch 机制不是用来保护共享资源或者临界区。它是用来同步一个或者多个执行多个任务的线程。它只能使用一次。像之前解说的,一旦CountDownLatch的计数器到达0,任何对它的方法的调用都是无效的。如果你想再次同步,你必须创建新的对象。

CountDownLatch 类有另一种版本的 await() 方法,它是:

  • await(long time, TimeUnit unit): 此方法会休眠直到被中断; CountDownLatch 内部计数器到达0或者特定的时间过去了。TimeUnit 类包含了:DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, 和 SECONDS.

转载于:https://www.cnblogs.com/pypua/articles/7307648.html

java线程并发库之--线程同步工具CountDownLatch用法相关推荐

  1. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

  2. 线程并发库和线程池的作用_并发–顺序线程和原始线程

    线程并发库和线程池的作用 不久前,我参与了一个项目,该项目的报告流程如下: 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新 ...

  3. java线程并发库之--线程同步工具Exchanger的使用

    Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.今天我们就通过实例来学习一下Exchanger的用法. Exchanger的简单实例 Exchanger是 ...

  4. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

  5. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  6. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  7. Java高并发编程:线程池

    这里首先介绍了java5中的并发的小工具包:java.util.concurrent.atomic,然后介绍了线程池的概念,对使用java5的方式创建不同形式的线程进行了演示,之后介绍了两个 对象:C ...

  8. Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信

    为什么80%的码农都做不了架构师?>>>    Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...

  9. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

最新文章

  1. 澎思科技与新加坡国立大学等高校共研AI产品加快技术应用落地
  2. 数据库的字段是date java里面能用timestamp吗_数据库中DATETIME,DATE和TIMESTAMP类型 的区别...
  3. python基础之协程,列表生成式,生成器表达式
  4. html5 postMessage解决跨域、跨窗口消息传递
  5. Java中对接钉钉API获取数据流程
  6. 手机内置摄像头接线图解_苹果手机,二手价格如何?
  7. HDU - 6661 Acesrc and String Theory (后缀数组)
  8. SpringFramework5.0 @Indexed注解 简单解析
  9. 解决 Script Error 的另类思路
  10. 作为面试官,我是怎么快速判断程序员能力的?
  11. 8.携程架构实践 --- 监控
  12. 两则新闻的另外一种角度
  13. 学习java需要用到哪些软件?
  14. 深度揭秘Greenplum数据库透明加密
  15. python+appium+android模拟器自动化测试 源码
  16. [置顶] 增强型的FLEA_Db_TableDataGateway,提供按字段名称操作的功能
  17. ubuntu禁止自动锁屏
  18. 数据分析师的就业前景如何?
  19. MATLAB中图像标注工具——Image Labeler的使用方法
  20. python_dya02_基础运算符

热门文章

  1. thinkphp日志泄漏漏洞_【Windows高危漏洞预警】CVE20200601,影响关键加密功能
  2. matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc
  3. php酷狗音乐json,用php来搜索酷狗音乐
  4. 国际旅游管理专业跨专业考计算机,旅游管理考研我想跨专业考旅游管理专业的研究 – 手机爱问...
  5. java stack list_JAVA自己实现List接口Stack
  6. webservice接口_webservice服务器端发票识别接口
  7. Win32ASM学习[19]:结构与联合
  8. error: expected unqualified-id before 'public'
  9. 服务器共享文件审计,内网安全管理系统-共享审计
  10. 对qps、tps、pv、uv的理解