Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255386
  • 博文数量: 164
  • 博客积分: 60
  • 博客等级: 民兵
  • 技术积分: 1129
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 21:55
文章分类

全部博文(164)

文章存档

2017年(2)

2015年(67)

2014年(95)

我的朋友

分类: Java

2015-05-06 17:28:10

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

用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用CyclicBarrier

CountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。

CountDownLatch 的一个有用特性是,它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await
    
    一个简单Demo:
    
    

点击(此处)折叠或打开

  1. public class CountdownLatchTest {

  2.     public static void main(String[] args) {
  3.         ExecutorService service = Executors.newCachedThreadPool();
  4.         final CountDownLatch cdOrder = new CountDownLatch(1);
  5.         final CountDownLatch cdAnswer = new CountDownLatch(3);        
  6.         for(int i=0;i<3;i++){
  7.             Runnable runnable = new Runnable(){
  8.                     public void run(){
  9.                     try {
  10.                         System.out.println("线程" + Thread.currentThread().getName() +
  11.                                 "正准备接受命令");                        
  12.                         cdOrder.await();
  13.                         System.out.println("线程" + Thread.currentThread().getName() +
  14.                         "已接受命令");                                
  15.                         Thread.sleep((long)(Math.random()*10000));    
  16.                         System.out.println("线程" + Thread.currentThread().getName() +
  17.                                 "回应命令处理结果");                        
  18.                         cdAnswer.countDown();                        
  19.                     } catch (Exception e) {
  20.                         e.printStackTrace();
  21.                     }                
  22.                 }
  23.             };
  24.             service.execute(runnable);
  25.         }        
  26.         try {
  27.             Thread.sleep((long)(Math.random()*10000));
  28.         
  29.             System.out.println("线程" + Thread.currentThread().getName() +
  30.                     "即将发布命令");                        
  31.             cdOrder.countDown();
  32.             System.out.println("线程" + Thread.currentThread().getName() +
  33.             "已发送命令,正在等待结果");    
  34.             cdAnswer.await();
  35.             System.out.println("线程" + Thread.currentThread().getName() +
  36.             "已收到所有响应结果");    
  37.         } catch (Exception e) {
  38.             e.printStackTrace();
  39.         }                
  40.         service.shutdown();

  41.     }
  42. }
结果:
线程pool-1-thread-1正准备接受命令
线程pool-1-thread-3正准备接受命令
线程pool-1-thread-2正准备接受命令
线程main即将发布命令
线程main已发送命令,正在等待结果
线程pool-1-thread-1已接受命令
线程pool-1-thread-3已接受命令
线程pool-1-thread-2已接受命令
线程pool-1-thread-2回应命令处理结果
线程pool-1-thread-3回应命令处理结果
线程pool-1-thread-1回应命令处理结果
线程main已收到所有响应结果

阅读(720) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~