統計

          留言簿(1)

          DB

          Others

          QA

          Tech Website

          閱讀排行榜

          評論排行榜

          CountDownLatch in Java

            
           1. Description
                 A java.util.concurrent.CountDownLatch is a concurrency construct that allows one or more threads to wait for a given set of operations to complete.
                 A CountDownLatch is a versatile synchronization tool and can be used for a number of purposes. A CountDownLatch initialized with a count of one serves as a simple on/off latch, or gate: all threads invoking await wait at the gate until it is opened by a thread invoking countDown(). A CountDownLatch initialized to N can be used to make one thread wait until N threads have completed some action, or some action has been completed N times

          3. Its methods
          void await()
          Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted.
          boolean await(long timeout, TimeUnit unit)
          Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted, or the specified waiting time elapses.
          void countDown()
          Decrements the count of the latch, releasing all waiting threads if the count reaches zero.
          long getCount()
          Returns the current count.
          String toString()
          Returns a string identifying this latch, as well as its state.


          3.Sample usage:
               *The first is a start signal that prevents any worker from proceeding until the driver is ready for them to proceed;
               *The second is a completion signal that allows the driver to wait until all workers have completed.

          class Driver {
              
          public static void main(String[] args) throws InterruptedException {
                  
          final int N = 3;
                  CountDownLatch startSignal 
          = new CountDownLatch(1);
                  CountDownLatch doneSignal 
          = new CountDownLatch(N);

                  
          for (int i = 0; i < N; ++i)
                      
          new Thread(new Worker(startSignal, doneSignal)).start(); // create and start threads

                  doSomethingElse(); 
          // don't let run yet
                  startSignal.countDown(); // let all threads proceed
                  doSomethingElse();
                  doneSignal.await(); 
          // wait for all to finish
                  System.out.println("Diver has waited for all workers\' work completed");
              }


              
          private static void doSomethingElse() {
                      System.out.println(
          "Driver is doing sth. else");
              }

          }


          class Worker implements Runnable {
              
          private final CountDownLatch startSignal;
              
          private final CountDownLatch doneSignal;

              Worker(CountDownLatch startSignal, CountDownLatch doneSignal) 
          {
                  
          this.startSignal = startSignal;
                  
          this.doneSignal = doneSignal;
              }


              
          public void run() {
                  
          try {
                      startSignal.await();
                      doWork();
                      doneSignal.countDown();
                      System.out.println(
          "done signal, count is " + doneSignal.getCount());
                  }
           catch (InterruptedException ex) {
                  }
           // return;
              }


              
          private void doWork() {
                  System.out.println(
          "Worker is doing his work");
              }

          }

          4. Reference
              api:http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html

          posted on 2011-05-07 15:10 XXXXXX 閱讀(259) 評論(0)  編輯  收藏 所屬分類: Programing

          主站蜘蛛池模板: 雷山县| 西安市| 垣曲县| 封开县| 扎囊县| 运城市| 台湾省| 城口县| 本溪市| 芜湖市| 巴青县| 隆昌县| 七台河市| 东台市| 曲麻莱县| 乐陵市| 龙胜| 丰都县| 会东县| 江孜县| 布尔津县| 玛沁县| 隆尧县| 滦平县| 府谷县| 宜良县| 玉林市| 鄂州市| 贺兰县| 双流县| 扬中市| 木兰县| 高雄县| 手游| 瓮安县| 花莲县| 安陆市| 泽库县| 丹东市| 和龙市| 黔江区|