天天看點

并發程式設計工具之一:CountDownLatch 用法

CountDownLatch 用法

CountDownLatch是java.util.concurrent包中一個類,CountDownLatch隻要提供的機制是多個(具體數量等于初始化CountDownLatch時count的值)線程都達到了預期狀态或者完成了預期工作時觸發事件,其他線程可以等待這個事件來觸發自己後續的工作。等待的線程可以是多個,即CountDownLatch可以喚醒多個等待的線程。到達自己預期狀态的線程會調用CountDownLatch的countDown方法,而等待的線程會調用CountDownLatch的await方法。

每次調用countDown方法時,計數都會減1,直到0為止,此時因調用await方法的阻塞線程被喚醒

代碼例子:

public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDown = new CountDownLatch(1);
        CountDownLatch await = new CountDownLatch(5);
 
        // 依次建立并啟動處于等待狀态的5個MyRunnable線程
        for (int i = 0; i < 5; ++i) {
            new Thread(new MyRunnable(countDown, await)).start();
        }
 
        System.out.println("用于觸發處于等待狀态的線程開始工作......");
        System.out.println("用于觸發處于等待狀态的線程工作完成,等待狀态線程開始工作......");
        countDown.countDown();
        await.await();
        System.out.println("Bingo!");
}
 
public class MyRunnable implements Runnable {
 
    private final CountDownLatch countDown;
    private final CountDownLatch await;
 
    public MyRunnable(CountDownLatch countDown, CountDownLatch await) {
        this.countDown = countDown;
        this.await = await;
    }
 
    public void run() {
        try {
            countDown.await();//等待主線程執行完畢,獲得開始執行信号...
            System.out.println("處于等待的線程開始自己預期工作......");
            await.countDown();//完成預期工作,發出完成信号...
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
運作結果:
用于觸發處于等待狀态的線程開始工作......
用于觸發處于等待狀态的線程工作完成,等待狀态線程開始工作......
處于等待的線程開始自己預期工作......
處于等待的線程開始自己預期工作......
處于等待的線程開始自己預期工作......
處于等待的線程開始自己預期工作......
處于等待的線程開始自己預期工作......

Bingo!           

繼續閱讀