1. 程式人生 > >Java併發程式設計之——CountDownLatch的使用

Java併發程式設計之——CountDownLatch的使用

最近在開發Android專案的時候有一個需求:在Service中開啟多個執行緒併發的執行任務,當這三個執行緒執行完畢之後,主執行緒才能繼續往下執行。剛開始使用的是AsyncTask+AtomicInteger的方式,然後在onpostexecute回撥中對AtomicInteger進行自增且判斷其值是否達到了要求的值,如果達到了要求的值就繼續執行相應的操作,否則跳過。但是發現這種方式並不能很好的實現想要的效果!於是研究了下Java併發程式設計中的CountDownLatch使用。

CountDownLatch位於包java.util.concurrent下面,它的應用場景是:有一個任務,需要等待其他幾個任務完成之後才能繼續執行,這個時候就可以使用CountDownLatch了。


CountDownLatch有一個構造器,count代表計數值,也就是任務的個數。

  1. public CountDownLatch(int count) {  
  2.        if (count <0) throw new IllegalArgumentException("count <0");  
  3.        this.sync = new Sync(count);  
  4.    }  
還有三個方法:
  1. publicvoid await() throws InterruptedException {} //呼叫await執行緒會被掛起,直到count計數值為0才繼續執行
  2. publicboolean await(
    long timeout, TimeUnit unit)throws InterruptedException {}//和await類似,只不過當等待時間後如果count還沒變為0就繼續執行。
  3. publicvoid countDown() {    }//count計數值減一
下面是演示程式碼:
  1. package com.easyliu.java.demo;  
  2. import java.util.concurrent.CountDownLatch;  
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. publicclass CountDownLatchTest {  
  6.     privatestatic CountDownLatch sCountDownLatch = null;  
  7.     privatestaticfinalint THREAD_NUMBER = 3;  
  8.     /** 
  9.      * @param args 
  10.      */
  11.     publicstaticvoid main(String[] args) {  
  12.         sCountDownLatch = new CountDownLatch(THREAD_NUMBER);  
  13.         //執行緒池
  14.         ExecutorService fixedThreadPool = Executors  
  15.                 .newFixedThreadPool(THREAD_NUMBER);  
  16.         //執行執行緒
  17.         fixedThreadPool.execute(new ConsumeRunnable("one"));  
  18.         fixedThreadPool.execute(new ConsumeRunnable("two"));  
  19.         fixedThreadPool.execute(new ConsumeRunnable("three"));  
  20.         System.out.println("等待3個子執行緒執行完畢...");  
  21.         try {  
  22.             sCountDownLatch.await();  
  23.             System.out.println("3個子執行緒已經執行完畢");  
  24.             System.out.println("繼續執行主執行緒");  
  25.         } catch (InterruptedException e) {  
  26.             e.printStackTrace();  
  27.         }  
  28.     }  
  29.     privatestaticclass ConsumeRunnable implements Runnable {  
  30.         private String mName;  
  31.         public ConsumeRunnable(String name) {  
  32.             this.mName = name;  
  33.         }  
  34.         publicvoid run() {  
  35.             System.out.println("子執行緒" + mName + "正在執行");  
  36.             try {  
  37.                 Thread.sleep(3000);// 模擬耗時操作
  38.                 System.out.println("子執行緒" + mName + "執行完畢");  
  39.                 sCountDownLatch.countDown();  
  40.             } catch (InterruptedException e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43.         }  
  44.     }  
  45. }  

輸入如下所示:
  1. 等待3個子執行緒執行完畢...  
  2. 子執行緒two正在執行  
  3. 子執行緒one正在執行  
  4. 子執行緒three正在執行  
  5. 子執行緒one執行完畢  
  6. 子執行緒three執行完畢  
  7. 子執行緒two執行完畢  
  8. 3個子執行緒已經執行完畢  
  9. 繼續執行主執行緒  

轉載於:https://blog.csdn.net/liuyi1207164339/article/details/51597408