CountDownLatch閉鎖是一種同步工具類
可以延遲線程的進度直到閉鎖到達終止狀態(tài)。Latch在英語中就是門栓的意思,所以形象地說閉鎖就相當于一扇門狈究,在日常生 活中我們都遇到過類似的場景控汉,進入一個場館前,必須達到一定的條件腥沽,比如活動開始前半小時可以入場;如果來早了的話鸠蚪,對不起今阳,以便等著师溅。 CountDownLatch 在多線程中也是這樣的作用,在閉鎖到達結(jié)束狀態(tài)前盾舌,這扇門是一直關(guān)閉的墓臭,不允許任何線程通過,當?shù)竭_結(jié)束狀態(tài)時妖谴,這扇門就 保持打開窿锉,并且是永久的處于打開狀態(tài);也就是說這個門是一次性的膝舅。 如同柏林墻一樣嗡载,推到了就建不起來了。
CountDownLatch閉鎖可以用來確保某些活動直到其他活動都完成后才繼續(xù)執(zhí)行
CountDownLatch是一種靈活的閉鎖實現(xiàn)仍稀,它可以使一個或多個線程 等待一組事件的發(fā)生洼滚。閉鎖包括一個計數(shù)器,該計數(shù)器被初始化為一個正整數(shù)技潘,表示等待的事件數(shù)量遥巴。有一等待時間發(fā)生時,使用countDown方法遞減計數(shù) 器享幽,而await方法就是等待所有事件的發(fā)生铲掐,也就是計數(shù)器的值為0.如果計數(shù)器的值不為0 那么await 方法需要一直等待。
CountDownLatch閉鎖示例代碼
import java.util.concurrent.CountDownLatch;
/*
* CountDownLatch :閉鎖值桩,在完成某些運算是摆霉,只有其他所有線程的運算全部完成,當前運算才繼續(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("耗費時間為:" + (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();
}
}
}