CountDownLatch這個(gè)類能夠使一個(gè)線程等待其他線程完成各自的工作后再執(zhí)行祖搓。例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有的框架服務(wù)之后再執(zhí)行(例如ZK的啟動(dòng))。
CountDownLatch是通過一個(gè)計(jì)數(shù)器來實(shí)現(xiàn)的浇衬,計(jì)數(shù)器的初始值為線程的數(shù)量挠锥。每當(dāng)一個(gè)線程完成了自己的任務(wù)后,計(jì)數(shù)器的值就會(huì)減1勋颖。當(dāng)計(jì)數(shù)器值到達(dá)0時(shí)嗦嗡,它表示所有的線程已經(jīng)完成了任務(wù),然后在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)饭玲。
public class CountDownLatchDemo implements Runnable {
static final CountDownLatch count = new CountDownLatch(10);
static final CountDownLatchDemo demo = new CountDownLatchDemo();
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println("線程: "+ Thread.currentThread().getId() + " 執(zhí)行完畢");
count.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException{
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
service.submit(demo);
}
count.await();
System.out.println("全部執(zhí)行結(jié)束");
//結(jié)束全部線程
service.shutdown();
}
}
可以看到以下結(jié)果
new CountDownLatch(10) 這里說明,計(jì)數(shù)數(shù)量是10,需要有10個(gè)線程完成任務(wù),才能繼續(xù)往下執(zhí)行侥祭。
count.countDown();表示每執(zhí)行結(jié)束一個(gè)線程就會(huì)減一。