zoukankan      html  css  js  c++  java
  • 闭锁-CountDownLatch

    作用:用于一个或多个线程等待其它(一个或多个线程)完成相关操作.像日常生活的门锁一样,比如门装了三把锁,只有当三个把锁都打开时,门才能被打开.
    方法:
    CountDownLatch(int count)初始化闭锁,指定闩数量.
    await();等待通过锁,只有所有的闩都释放后,才能通过锁,阻塞当前线程.
    countDown();释放一个闩;
    //同 await(),这里指定一个等待超时时间,当到达指定的超时时间后,闩的数量没有减少到0,则返回 false,这里注意当前线程会阻塞指定的超时时间;
    //若在指定超时时间内,闩的数量减少到0,会立即返回 true.
    boolean await(long timeout, TimeUnit unit);
    long getCount();//获取闩的数量,主要用于调试
    实现原理:
    请参考抽象同步队列(AbstractQueuedSynchronizer)
    例子:
     
     1 public class CountDownLatchDemo {
     2 
     3     private static CountDownLatch countDownLatch=new CountDownLatch(100);
     4 
     5     private static int index=0;
     6     public static void main(String[] args) {
     7         try {
     8             for(int i=0;i<5;++i){
     9                 new Thread(){
    10                     @Override
    11                     public void run() {
    12                         try {
    13                             System.out.println("the thread "+Thread.currentThread().getId()+" pre entry the countdownlatch");
    14                             countDownLatch.await();
    15                             System.out.println("the thread "+Thread.currentThread().getId()+" pass the countdonwlatch!");
    16                         }catch (Throwable throwable){
    17                             throwable.printStackTrace();
    18                         }
    19                     }
    20                 }.start();
    21             }
    22             while (index++<100) {
    23                 new Thread() {
    24                     @Override
    25                     public void run() {
    26                         try {
    27                             Thread.sleep(100);
    28                         } catch (Throwable throwable) {
    29                             throwable.printStackTrace();
    30                         }
    31 
    32                         System.out.println("countdown of thread " + Thread.currentThread().getId());
    33                         countDownLatch.countDown();
    34                     }
    35                 }.start();
    36             }
    37             System.in.read();
    38         }catch (Throwable throwable){
    39             throwable.printStackTrace();
    40         }
    41 
    42 
    43     }
    44 }
    View Code
  • 相关阅读:
    poj2328简单模拟
    一个简单的Silverlight的DataBinding和DateTemplate的Demo
    poj3468线段树_区间数字统计
    一个Silverlight的可视化图的DataBinding的Demo
    poj3321 dfs+树状数组
    C#拖拽控件
    【存档归纳】Sqlserver数据库详解 深度挖掘sqlserver帮助所得 一
    电脑蓝屏原因分析利器
    C# B/S程序如何获取客户端的MAC地址
    尚需研究之QQ音乐首页的图片轮换
  • 原文地址:https://www.cnblogs.com/hhbk/p/7735516.html
Copyright © 2011-2022 走看看