愛睡覺的程序員

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks

          Java的concurrent包里面的CountDownLatch其實可以把它看作一個計數器,只不過這個計數器的操作是原子操作,同時只能有一個線程去操作這個計數器,也就是同時只能有一個線程去減這個計數器里面的值。

                你可以向CountDownLatch對象設置一個初始的數字作為計數值,任何調用這個對象上的await()方法都會阻塞,直到這個計數器的計數值被其他的線程減為0為止。

                CountDownLatch的一個非常典型的應用場景是:有一個任務想要往下執行,但必須要等到其他的任務執行完畢后才可以繼續往下執行。假如我們這個想要繼續往下執行的任務調用一個CountDownLatch對象的await()方法,其他的任務執行完自己的任務后調用同一個CountDownLatch對象上的countDown()方法,這個調用await()方法的任務將一直阻塞等待,直到這個CountDownLatch對象的計數值減到0為止。

                舉個例子,有五個工人在為老板干活,這個老板有一個習慣,就是當五個工人把一天的活都干完了的時候,他就來檢查所有工人所干的活。

           1 import java.util.Random;
           2 import java.util.concurrent.CountDownLatch;
           3 import java.util.concurrent.ExecutorService;
           4 import java.util.concurrent.Executors;
           5 import java.util.concurrent.TimeUnit;
           6 
           7 public class CountDownLatchTest {
           8 
           9     private static CountDownLatch downLatch = new CountDownLatch(5);
          10 
          11     public static void main(String[] args) {
          12         ExecutorService executorService = Executors.newFixedThreadPool(10);
          13         executorService.submit(new Boss());
          14         executorService.submit(new Worker("1"));
          15         executorService.submit(new Worker("2"));
          16         executorService.submit(new Worker("3"));
          17         executorService.submit(new Worker("4"));
          18         executorService.submit(new Worker("5"));
          19         executorService.shutdown();
          20     }
          21 
          22     static class Worker implements Runnable{
          23         private String name ;
          24 
          25         public Worker(String name){
          26             this.name = name;
          27         }
          28         @Override
          29         public void run() {
          30             try {
          31                 TimeUnit.SECONDS.sleep(new Random().nextInt(10));
          32             } catch (InterruptedException e) {
          33                 e.printStackTrace();
          34             }
          35             System.out.println("工人" + name + ",工作完畢");
          36             downLatch.countDown();
          37         }
          38     }
          39 
          40     static class Boss implements Runnable{
          41 
          42         @Override
          43         public void run() {
          44             try {
          45                 downLatch.await();
          46             } catch (InterruptedException e) {
          47                 e.printStackTrace();
          48             }
          49             System.out.println("Boss 檢查工作");
          50         }
          51     }
          52 }
          53 
          posted on 2015-02-26 15:09 polang 閱讀(127) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 镇雄县| 女性| 龙门县| 如东县| 惠安县| 三原县| 大石桥市| 毕节市| 湖口县| 阜南县| 常州市| 九江县| 湟中县| 赣榆县| 安吉县| 独山县| 台中县| 五莲县| 惠来县| 贵定县| 江口县| 长兴县| 庆安县| 五常市| 济南市| 贵定县| 建宁县| 闵行区| 新营市| 鄄城县| 怀仁县| 饶阳县| 四平市| 澄江县| 偏关县| 建始县| 岳西县| 牟定县| 镇康县| 塔城市| 本溪市|