1. 程式人生 > >Java多執行緒-CountDownLatch用法

Java多執行緒-CountDownLatch用法

CountDownLatch 可以立即看作一個計數器,不過計數是原子操作,也就是說同一時間只有一個執行緒能夠操作該計數器;

我們先看看該類常用的幾個方法:
這裡寫圖片描述

你可以給它設定一個數目,呼叫該類await方法會使呼叫await的方法的執行緒處於等待狀態;直到該計數器計數為0;由此特性,我們可以將它用於一下場景:

場景:只有把所有的任務執行完畢後才執行另外一個任務

下面演示是當把三個WorkTask任務都執行完畢後才執行AllTaskDonedTask任務

public class Test{

public static void main(String[] args) {

        int
taskSize = 3; //建立一個計數器,並對其初始化 final CountDownLatch doneSingle = new CountDownLatch(taskSize); //建立一個固定執行緒池,此處執行緒池的執行緒數目和taskSize無直接關 Executor executor = Executors.newFixedThreadPool(taskSize); //執行所有任務 for (int i = 0; i < taskSize; i++) { executor.execute(new
WorkTask(doneSingle)); } executor.execute(new AllTaskDonedTask(countDownLatch)); } static class WorkTask implements Runnable { CountDownLatch mCountDownLatch; public WorkTask(CountDownLatch countDownLatch) { mCountDownLatch = countDownLatch; } @Override
public void run() { try { println(Thread.currentThread().getName()+" execute task...."); Thread.sleep(1000);//模擬耗時操作 mCountDownLatch.countDown();//任務執行完畢計數器減1 } catch (InterruptedException e) { e.printStackTrace(); } } } //所有任務執行完畢後需要執行的任務 static class AllTaskDonedTask implements Runnable { CountDownLatch mCountDownLatch; public AllTaskDonedTask(CountDownLatch countDownLatch) { mCountDownLatch = countDownLatch; } @Override public void run() { try { mCountDownLatch.await();//此處會使當前執行緒處於等待狀態,直到3個WorkTask全部執行完畢,才會繼續執行下面 println("所有任務執行完畢我才執行"); } catch (InterruptedException e) { e.printStackTrace(); } } } }

執行結果

pool-1-thread-3 execute task....
pool-1-thread-1 execute task....
pool-1-thread-2 execute task....
所有任務執行完畢我才執行

從上面程式碼我們不難看出,我們在執行WorkTask任務結束時都需要對計數器減1;在AllTaskDonedTask任務執行前需要呼叫CountDownLatch.await()方法,這樣當前執行緒會處於等待狀態,直到計數器減為0時也即WorkTask任務都執行完畢後,AllTaskDonedTask方可執行。