方法说明:
 
public void countDown()
     递减锁存器的计数,如果计数到达零,则释放所有等待的线程。如果当前计数大于零,则将计数减少。如果新的计数为零,出于线程调度目的,将重新启用所有的等待线程。
     如果当前计数等于零,则不发生任何操作。

public boolean await(long timeout, TimeUnit unit)throws InterruptedException
     使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。如果当前计数为零,则此方法立刻返回 true 值。

     如果当前计数大于零,则出于线程调度目的,将禁用当前线程,且在发生以下三种情况之一前,该线程将一直处于休眠状态:
         由于调用 countDown() 方法,计数到达零;或者其他某个线程中断当前线程;或者已超出指定的等待时间。
          * 如果计数到达零,则该方法返回 true 值。
          * 如果当前线程,在进入此方法时已经设置了该线程的中断状态;或者在等待时被中断, 则抛出 InterruptedException,并且清除当前线程的已中断状态。
          * 如果超出了指定的等待时间,则返回值为 false。如果该时间小于等于零,则此方法根本不会等待。
    
     参数:
         timeout - 要等待的最长时间
         unit - timeout 参数的时间单位。
     返回:
         如果计数到达零,则返回 true;如果在计数到达零之前超过了等待时间,则返回 false
     抛出:
          InterruptedException - 如果当前线程在等待时被中断
 
例子1:
     主线程等待子线程执行完成在执行。
     
 import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CountdownLatchTest1 { public static void main(String[] args) {
ExecutorService service = Executors. newFixedThreadPool(3);
final CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
Runnable runnable = new Runnable() { @Override
public void run() {
try {
System. out.println("子线程" + Thread.currentThread().getName() + "开始执行");
Thread. sleep((long) (Math. random() * 10000));
System. out.println("子线程" + Thread.currentThread().getName() + "执行完成");
latch.countDown(); // 当前线程调用此方法,则计数减一
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
} try {
System. out.println("主线程" + Thread.currentThread().getName() + "等待子线程执行完成..." );
latch.await(); // 阻塞当前线程,直到计时器的值为0
System. out.println("主线程" + Thread.currentThread().getName() + "开始执行...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
例子2:
     百米赛跑,4名运动员选手到达场地等待裁判口令,裁判一声口令,选手听到后同时起跑,当所有选手到达终点,裁判进行汇总汇总排名。
 
 import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CountdownLatchTest2 { public static void main(String[] args) {
ExecutorService service = Executors. newCachedThreadPool();
final CountDownLatch cdOrder = new CountDownLatch(1);
final CountDownLatch cdAnswer = new CountDownLatch(4);
for (int i = 0; i < 4; i++) {
Runnable runnable = new Runnable() {
public void run() {
try {
System. out.println("选手" + Thread.currentThread().getName() + "正等待裁判发布口令");
cdOrder.await();
System. out.println("选手" + Thread.currentThread().getName() + "已接受裁判口令");
Thread. sleep((long) (Math. random() * 10000));
System. out.println("选手" + Thread.currentThread().getName() + "到达终点");
cdAnswer.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
try {
Thread. sleep((long) (Math. random() * 10000)); System. out.println("裁判" + Thread.currentThread ().getName() + "即将发布口令" );
cdOrder.countDown();
System. out.println("裁判" + Thread.currentThread ().getName() + "已发送口令,正在等待所有选手到达终点" );
cdAnswer.await();
System. out.println("所有选手都到达终点" );
System. out.println("裁判" + Thread.currentThread ().getName() + "汇总成绩排名" );
} catch (Exception e) {
e.printStackTrace();
}
service.shutdown(); }
}
 

CountDownLatch(倒计时计数器)使用说明的更多相关文章

  1. java 多线程 day16 CountDownLatch 倒计时计数器

    import java.util.concurrent.CountDownLatch;import java.util.concurrent.CyclicBarrier;import java.uti ...

  2. CountDownLatch(倒计时计数器)使用说明 --并发

    方法说明:   public void countDown()      递减锁存器的计数,如果计数到达零,则释放所有等待的线程.如果当前计数大于零,则将计数减少.如果新的计数为零,出于线程调度目的, ...

  3. java 多线程通知 CountDownLatch 倒数计数器的使用

    package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework. ...

  4. cocurrent包countdownlatch 倒计时门栓

    latch 英[lætʃ]美[lætʃ]n. 门闩; 弹簧锁; 锁是每个类的成员变量,它是这个类的固有属性,当然要声明为成员变量. 成员变量的初始化是通过对象的构造函数的. 锁是每个类的成员变量,它是 ...

  5. Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

    本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...

  6. 并发库应用之九 & 到时计数器CountDownLatch应用

    申明:CountDownLatch好像倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当到达0时,所有等待者就开始执行. java.util.concurre ...

  7. Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier

    Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...

  8. CountDownLatch 计数器

    这里我暂时只讲CountDownLatch的作用和怎么使用,至于他是怎么实现这种功能的,涉及源码,以后我再补上. 正文 什么是CountDownLatch? CountDownLatch是在java1 ...

  9. JAVA多线程提高十:同步工具CyclicBarrier与CountDownLatch

    今天继续学习其它的同步工具:CyclicBarrier与CountDownLatch 一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ...

随机推荐

  1. apache点NET环境

    1.首先 下载一个mod_aspdotnet-2.2.0.2006-setup-r2.msi 2.安装好后在apache的moudles目录会生成一个mod_aspdotnet.so文件 3.修改ht ...

  2. js模拟Map对象,实现key---value

    js模拟Map对象,实现key---value 根据java中map的属性,实现key----value保存 function Map() { var struct = function (key, ...

  3. ☀【JS】Code

    1 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf- ...

  4. MVC3.0 中Razor 学习

    随着MVC3.0RTM版本的发布,最近将公司的项目从MVC2.0升级到MVC3.0.同时打算在MVC3中全面使用Razor模板引擎.现将Razor学习拿出来和大家分享,如果存在不足的地方欢迎您指出. ...

  5. POJ 2406

    思路:由于题目要求的是最大值,因此从n开始向下查找,第一次出现的满足条件的那个数就是最大的,查找就可以结束,如果查找到1是仍未找到合适的值,则为1,就是说不是任何字符串的次方如abcd #includ ...

  6. editpuls查找替换通配符

    1  \t    Tab character.         tab符号 2  \n    New line.              新的一行(换行符) 3  .     Matches any ...

  7. Linux/U-Boot Git Repo

    Linux: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git   U-Boot: git://git.denx.de/ ...

  8. 关于Eclispse连接Mysql的Jdbc

    1.在Eclipse中新建Java工程 2.引入JDBC库(在bulid path 的extenrnal里) 3. 1)导入sql包(import java.sql.*) 2)加载(注册)mysql ...

  9. puppet案例

    实例一.文件分发描述:通过puppet服务端可以向被管理机(客户端)上推送文件,方法是使用file类型的source属性 第一步:#vi /etc/puppet/fileserver.conf  1  ...

  10. post方法

    CookieContainer cookie = new CookieContainer(); private string HttpPost(string Url, string postDataS ...