愛睡覺的程序員

            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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 巴马| 屏南县| 平远县| 安平县| 永兴县| 永福县| 喀什市| 南澳县| 宁化县| 曲麻莱县| 嘉鱼县| 迭部县| 寻甸| 响水县| 苍南县| 五原县| 泰安市| 云浮市| 蒙阴县| 郑州市| 吉林省| 康保县| 湄潭县| 诏安县| 兴海县| 石阡县| 南平市| 渭源县| 商丘市| 彭水| 崇左市| 城固县| 海丰县| 旬阳县| 邓州市| 布拖县| 砚山县| 亚东县| 南投市| 凉山| 和平区|