CountDownLatch閉鎖是一種同步工具類
可以延遲線程的進(jìn)度直到閉鎖到達(dá)終止?fàn)顟B(tài)。Latch在英語(yǔ)中就是門栓的意思,所以形象地說(shuō)閉鎖就相當(dāng)于一扇門,在日常生 活中我們都遇到過(guò)類似的場(chǎng)景,進(jìn)入一個(gè)場(chǎng)館前,必須達(dá)到一定的條件,比如活動(dòng)開始前半小時(shí)可以入場(chǎng);如果來(lái)早了的話,對(duì)不起,以便等著。 CountDownLatch 在多線程中也是這樣的作用,在閉鎖到達(dá)結(jié)束狀態(tài)前,這扇門是一直關(guān)閉的,不允許任何線程通過(guò),當(dāng)?shù)竭_(dá)結(jié)束狀態(tài)時(shí),這扇門就 保持打開,并且是永久的處于打開狀態(tài);也就是說(shuō)這個(gè)門是一次性的。 如同柏林墻一樣,推到了就建不起來(lái)了。
CountDownLatch閉鎖可以用來(lái)確保某些活動(dòng)直到其他活動(dòng)都完成后才繼續(xù)執(zhí)行
CountDownLatch是一種靈活的閉鎖實(shí)現(xiàn),它可以使一個(gè)或多個(gè)線程 等待一組事件的發(fā)生。閉鎖包括一個(gè)計(jì)數(shù)器,該計(jì)數(shù)器被初始化為一個(gè)正整數(shù),表示等待的事件數(shù)量。有一等待時(shí)間發(fā)生時(shí),使用countDown方法遞減計(jì)數(shù) 器,而await方法就是等待所有事件的發(fā)生,也就是計(jì)數(shù)器的值為0.如果計(jì)數(shù)器的值不為0 那么await 方法需要一直等待。
CountDownLatch閉鎖示例代碼
import java.util.concurrent.CountDownLatch;
/*
* CountDownLatch :閉鎖,在完成某些運(yùn)算是,只有其他所有線程的運(yùn)算全部完成,當(dāng)前運(yùn)算才繼續(xù)執(zhí)行
*/
public class TestCountDownLatch {
public static void main(String[] args) {
int countDownLatchTimes = 5;
final CountDownLatch latch = new CountDownLatch(countDownLatchTimes);
LatchDemo ld = new LatchDemo(latch);
long start = System.currentTimeMillis();
for (int i = 0; i < countDownLatchTimes; i++) {
new Thread(ld).start();
}
try {
latch.await();
} catch (InterruptedException e) {
}
long end = System.currentTimeMillis();
System.out.println("耗費(fèi)時(shí)間為:" + (end - start) + "毫秒!");
}
}
class LatchDemo implements Runnable {
private CountDownLatch latch;
public LatchDemo(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
for (int i = 0; i < 50000; i++) {
if (i % 2 == 0) {
// System.out.println(i);
}
}
} finally {
latch.countDown();
}
}
}