CountDownLatch 類,我們從字面上看它的意思就是:向下計數的鎖。
首先,借用API的一段文字:
一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。
用給定的計數 初始化 CountDownLatch
。由於調用了countDown()
方法,所以在當前計數到達零之前,await
方法會一直受阻塞。之後,會釋放所有等待的線程,await
的所有後續調用都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,請考慮使用CyclicBarrier
。
CountDownLatch
是一個通用同步工具,它有很多用途。將計數 1 初始化的CountDownLatch
用作一個簡單的開/關鎖存器,或入口:在通過調用
countDown()
的線程打開入口前,所有調用await
的線程都一直在入口處等待。用
N 初始化的 CountDownLatch
可以使一個線程在 N 個線程完成某項操作之前一直等待,或者使其在某項操作完成 N 次之前一直等待。
CountDownLatch
的一個有用特性是,它不要求調用
countDown
方法的線程等到計數到達零時才繼續,而在所有線程都能通過之前,它只是阻止任何線程繼續通過一個
await
。
在使用該類事,主要用到三個方法:
1. CountDownLatch(int count)
該類的構造方法,count爲初始的數字,也就是說向下計數的基。
2.
await(long timeout,TimeUnit unit)或
await()
該方法在當前線程計數(count)到零之前,或者到達指定的等待時間(timeout),是處在阻塞狀態。
3.
countDown()
減數功能,調用一次,count就減一。
注意事項: CountDownLatch 對象只能被實例一次,並且count減到零後,不可重置,實例化的CountDownLatch對象消失,它的其它方法也固然失效。
實例代碼:
public class MSample { private final static CountDownLatch mCountDownLatch = new CountDownLatch(1); private static class Test1 extends Thread { @Override public void run() { System.out.println("Test1 started!"); mCountDownLatch.countDown(); System.out.println("Test1 end!"); } } /** * 示例線程類 */ private static class Test2 extends Thread { @Override public void run() { System.out.println("Test2 started!"); try { mCountDownLatch.await(); } catch (InterruptedException e) { } System.out.println("Test2 end!"); } } public static void main(String[] args) throws Exception {
new Test2 ().start();new Test1 ().start(); }
Test2 started!
Test1 started!
Test2 end!
Test1 end!