乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java CountDownLatch應用

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

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

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

            舉個例子,有三個工人在為老板干活,這個老板有一個習慣,就是當三個工人把一天的活都干完了的時候,他就來檢查所有工人所干的活。記住這個條件:三個工人先全部干完活,老板才檢查。所以在這里用Java代碼設計兩個類,Worker代表工人,Boss代表老板,具體的代碼實現(xiàn)如下:

      Java代碼 
      1. package org.zapldy.concurrent;  
      2.   
      3. import java.util.Random;  
      4. import java.util.concurrent.CountDownLatch;  
      5. import java.util.concurrent.TimeUnit;  
      6.   
      7. public class Worker implements Runnable{  
      8.       
      9.     private CountDownLatch downLatch;  
      10.     private String name;  
      11.       
      12.     public Worker(CountDownLatch downLatch, String name){  
      13.         this.downLatch = downLatch;  
      14.         this.name = name;  
      15.     }  
      16.       
      17.     public void run() {  
      18.         this.doWork();  
      19.         try{  
      20.             TimeUnit.SECONDS.sleep(new Random().nextInt(10));  
      21.         }catch(InterruptedException ie){  
      22.         }  
      23.         System.out.println(this.name + "活干完了!");  
      24.         this.downLatch.countDown();  
      25.           
      26.     }  
      27.       
      28.     private void doWork(){  
      29.         System.out.println(this.name + "正在干活!");  
      30.     }  
      31.       
      32. }  

       

      Java代碼 
      1. package org.zapldy.concurrent;  
      2.   
      3. import java.util.concurrent.CountDownLatch;  
      4.   
      5. public class Boss implements Runnable {  
      6.   
      7.     private CountDownLatch downLatch;  
      8.       
      9.     public Boss(CountDownLatch downLatch){  
      10.         this.downLatch = downLatch;  
      11.     }  
      12.       
      13.     public void run() {  
      14.         System.out.println("老板正在等所有的工人干完活......");  
      15.         try {  
      16.             this.downLatch.await();  
      17.         } catch (InterruptedException e) {  
      18.         }  
      19.         System.out.println("工人活都干完了,老板開始檢查了!");  
      20.     }  
      21.   
      22. }  

       

      Java代碼 
      1. package org.zapldy.concurrent;  
      2.   
      3. import java.util.concurrent.CountDownLatch;  
      4. import java.util.concurrent.ExecutorService;  
      5. import java.util.concurrent.Executors;  
      6.   
      7. public class CountDownLatchDemo {  
      8.   
      9.     public static void main(String[] args) {  
      10.         ExecutorService executor = Executors.newCachedThreadPool();  
      11.           
      12.         CountDownLatch latch = new CountDownLatch(3);  
      13.           
      14.         Worker w1 = new Worker(latch,"張三");  
      15.         Worker w2 = new Worker(latch,"李四");  
      16.         Worker w3 = new Worker(latch,"王二");  
      17.           
      18.         Boss boss = new Boss(latch);  
      19.           
      20.         executor.execute(w3);  
      21.         executor.execute(w2);  
      22.         executor.execute(w1);  
      23.         executor.execute(boss);  
      24.           
      25.         executor.shutdown();  
      26.     }  
      27.   
      28. }  

             當你運行CountDownLatchDemo這個對象的時候,你會發(fā)現(xiàn)是等所有的工人都干完了活,老板才來檢查,下面是我本地機器上運行的一次結果,可以肯定的每次運行的結果可能與下面不一樣,但老板檢查永遠是在后面的。

      Java代碼 
      1. 王二正在干活!  
      2. 李四正在干活!  
      3. 老板正在等所有的工人干完活......  
      4. 張三正在干活!  
      5. 張三活干完了!  
      6. 王二活干完了!  
      7. 李四活干完了!  
      8. 工人活都干完了,老板開始檢查了!  

       

          好了,就寫到這里,睡覺去了!

       http://zapldy./blog/746458

      另一個比較簡單的例子

       

      public static void main(String[] args) throws InterruptedException {
      int threadNumber = 10;
      final CountDownLatch countDownLatch = new CountDownLatch(threadNumber);
      for (int i = 0; i < threadNumber; i++) {
      final int threadID = i;
      new Thread() {
      public void run() {
      try {
      Thread.sleep((long) (Math.random() * 10000));
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      System.out.println(String.format("threadID:[%s] finished!!", threadID));
      countDownLatch.countDown();
      }
      }.start();
      }


      countDownLatch.await();
      System.out.println("main thread finished!!");
      }


      http://www./topic/581476


        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多