隨筆 - 0, 文章 - 264, 評論 - 170, 引用 - 0
          數據加載中……

          CountDownLatch的使用(注:轉載于http://www.aygfsteel.com/fanjs2000/archive/2012/10/31/390521.html)

          CountDownLatch如其所寫,是一個倒計數的鎖存器,當計數減至0時觸發特定的事件。利用這種特性,可以讓主線程等待子線程的結束。下面以一個模擬運動員比賽的例子加以說明。

          import java.util.concurrent.CountDownLatch;
          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;

          public class Test {
              
          private static final int PLAYER_AMOUNT = 5;

              
          public static void main(String[] args) {        
                  
          //對于每位運動員,CountDownLatch減1后即結束比賽
                  CountDownLatch begin = new CountDownLatch(1);
                  
          //對于整個比賽,所有運動員結束后才算結束
                  CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
                  Player[] plays 
          = new Player[PLAYER_AMOUNT];

                  
          for (int i = 0; i < PLAYER_AMOUNT; i++)
                      plays[i] 
          = new Player(i + 1, begin, end);

                  
          //設置特定的線程池,大小為5
                  ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
                  
          for (Player p : plays)
                      exe.execute(p); 
          //分配線程
                  begin.countDown();
                  System.out.println(
          "Race begins!");
                  
          try {
                      end.await(); 
          //等待end狀態變為0,即為比賽結束
                  } catch (InterruptedException e) {
                      
          // TODO: handle exception
                      e.printStackTrace();
                  } 
          finally {
                      System.out.println(
          "Race ends!");
                  }
                  exe.shutdown();
              }
          }

          class Player implements Runnable {

              
          private int id;
              
          private CountDownLatch begin;
              
          private CountDownLatch end;

              
          public Player(int i, CountDownLatch begin, CountDownLatch end) {
                  
          // TODO Auto-generated constructor stub
                  super();
                  
          this.id = i;
                  
          this.begin = begin;
                  
          this.end = end;
              }

              
          public void run() {
                  
          // TODO Auto-generated method stub
                  try {
                      begin.await(); 
          //等待begin的狀態為0
                      Thread.sleep((long) (Math.random() * 100)); //隨機分配時間,即運動員完成時間
                      System.out.println("Play" + id + " arrived.");
                  } 
          catch (InterruptedException e) {
                      
          // TODO: handle exception
                      e.printStackTrace();
                  } 
          finally {
                      end.countDown(); 
          //使end狀態減1,最終減至0
                  }
              }
          }

          posted on 2012-10-31 17:19 小一敗涂地 閱讀(489) 評論(0)  編輯  收藏 所屬分類: 并發、多線程java語言相關

          主站蜘蛛池模板: 奉化市| 彰武县| 乌兰察布市| 丰城市| 博爱县| 垣曲县| 长葛市| 资阳市| 洛隆县| 山阴县| 苏州市| 长兴县| 永嘉县| 泽普县| 金川县| 卓资县| 宁蒗| 江油市| 于都县| 武川县| 蓝田县| 漠河县| 丹凤县| 房山区| 岑溪市| 阳泉市| 江陵县| 韩城市| 同江市| 嫩江县| 桂东县| 博湖县| 两当县| 平遥县| 宁蒗| 潮安县| 凤山县| 福安市| 金溪县| 玉环县| 绥滨县|