欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

多线程之CountDownLatch工具类,countdownlatch,CountDownLat

来源: javaer 分享于  点击 39065 次 点评:15

多线程之CountDownLatch工具类,countdownlatch,CountDownLat


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

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

使用场景:

可以实现一个人(也可以是多个人)等待其他所有人来通知他,也可以实现一个人通知多个人。

类似裁判一声口令,所有运动员开始跑步,所有运动员到达终点后需要裁判员报告成绩,裁判员公布结果。

实现如下:

package andy.thread.test;  import java.util.concurrent.CountDownLatch;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  /**  * @author Zhang,Tianyou  * @version 2014年11月9日 下午2:34:34  */  public class CountdownLatchTest {      public static void main(String[] args) {          ExecutorService service = Executors.newCachedThreadPool();          final CountDownLatch cdOrder = new CountDownLatch(1);          final CountDownLatch cdAnswer = new CountDownLatch(3);          for (int i = 0; i < 3; 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("线程" + Thread.currentThread().getName()                      + "已收到所有响应结果");          } catch (Exception e) {              e.printStackTrace();          }          service.shutdown();      }  }  

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

相关栏目:

用户点评