zoukankan      html  css  js  c++  java
  • CountDownLatch的使用

      CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。
     
     1 package com.thread;
     2 import java.util.concurrent.CountDownLatch;
     3 import java.util.concurrent.CyclicBarrier;
     4 import java.util.concurrent.ExecutorService;
     5 import java.util.concurrent.Executors;
     6 /**
     7  * 
     8  * @author Administrator
     9  *该程序用来模拟发送命令与执行命令,主线程代表指挥官,新建3个线程代表战士,战士一直等待着指挥官下达命令,
    10  *若指挥官没有下达命令,则战士们都必须等待。一旦命令下达,战士们都去执行自己的任务,指挥官处于等待状态,战士们任务执行完毕则报告给
    11  *指挥官,指挥官则结束等待。
    12  */
    13 public class CountdownLatchTest {
    14 
    15     public static void main(String[] args) {
    16         ExecutorService service = Executors.newCachedThreadPool(); //创建一个线程池
    17         final CountDownLatch cdOrder = new CountDownLatch(1);//指挥官的命令,设置为1,指挥官一下达命令,则cutDown,变为0,战士们执行任务
    18         final CountDownLatch cdAnswer = new CountDownLatch(3);//因为有三个战士,所以初始值为3,每一个战士执行任务完毕则cutDown一次,当三个都执行完毕,变为0,则指挥官停止等待。        
    19         for(int i=0;i<3;i++){
    20             Runnable runnable = new Runnable(){
    21                     public void run(){
    22                     try {
    23                         System.out.println("线程" + Thread.currentThread().getName() + 
    24                                 "正准备接受命令");                        
    25                         cdOrder.await(); //战士们都处于等待命令状态
    26                         System.out.println("线程" + Thread.currentThread().getName() + 
    27                         "已接受命令");                                
    28                         Thread.sleep((long)(Math.random()*10000));    
    29                         System.out.println("线程" + Thread.currentThread().getName() + 
    30                                 "回应命令处理结果");                        
    31                         cdAnswer.countDown(); //任务执行完毕,返回给指挥官,cdAnswer减1。                    
    32                     } catch (Exception e) {
    33                         e.printStackTrace();
    34                     }                
    35                 }
    36             };
    37             service.execute(runnable);//为线程池添加任务
    38         }        
    39         try {
    40             Thread.sleep((long)(Math.random()*10000));
    41         
    42             System.out.println("线程" + Thread.currentThread().getName() + 
    43                     "即将发布命令");                        
    44             cdOrder.countDown(); //发送命令,cdOrder减1,处于等待的战士们停止等待转去执行任务。
    45             System.out.println("线程" + Thread.currentThread().getName() + 
    46             "已发送命令,正在等待结果");    
    47             cdAnswer.await(); //命令发送后指挥官处于等待状态,一旦cdAnswer为0时停止等待继续往下执行
    48             System.out.println("线程" + Thread.currentThread().getName() + 
    49             "已收到所有响应结果");    
    50         } catch (Exception e) {
    51             e.printStackTrace();
    52         }                
    53         service.shutdown(); //任务结束,停止线程池的所有线程
    54 
    55     }
    56 }


    程序运行结果如下:

    线程pool-1-thread-2正准备接受命令
    线程pool-1-thread-3正准备接受命令
    线程pool-1-thread-1正准备接受命令
    线程main即将发布命令
    线程pool-1-thread-2已接受命令
    线程pool-1-thread-3已接受命令
    线程pool-1-thread-1已接受命令
    线程main已发送命令,正在等待结果
    线程pool-1-thread-2回应命令处理结果
    线程pool-1-thread-1回应命令处理结果
    线程pool-1-thread-3回应命令处理结果
    线程main已收到所有响应结果
  • 相关阅读:
    (转载)C++ string中find() ,rfind() 等函数 用法总结及示例
    UVA 230 Borrowers (STL 行读入的处理 重载小于号)
    UVA 12100 打印队列(STL deque)
    uva 12096 The SetStack Computer(STL set的各种库函数 交集 并集 插入迭代器)
    uva 1592 Database (STL)
    HDU 1087 Super Jumping! Jumping! Jumping!
    hdu 1176 免费馅饼
    HDU 1003 Max Sum
    转战HDU
    hust 1227 Join Together
  • 原文地址:https://www.cnblogs.com/liuling/p/2013-8-20-02.html
Copyright © 2011-2022 走看看