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!