CoundDownLatch 倒計(jì)數(shù)器
CoundDownLatch 多線程執(zhí)行贰军,比如控制讓其余5個(gè)線程執(zhí)行完畢
再繼續(xù)執(zhí)行自身剩余業(yè)務(wù)。
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 模塊:【倒計(jì)數(shù)器】
* <p>
* 開發(fā): Bruce.Liu By 2018/8/23 下午9:19 Create
*/
public class CountDownLatchDemo implements Runnable {
static final CountDownLatch end = new CountDownLatch(10);
static final CountDownLatchDemo demo = new CountDownLatchDemo();
@Override
public void run() {
try {
Integer rdm = new Random().nextInt(10)*1000;
//System.err.println(Thread.currentThread().getName()+" 暫停時(shí)間:"+rdm);
Thread.sleep(rdm);//隨機(jī)暫停
System.err.println(Thread.currentThread().getName()+" 線程已經(jīng)執(zhí)行完畢 ");
end.countDown();//標(biāo)示當(dāng)前線程已經(jīng)執(zhí)行完畢
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService ex = Executors.newFixedThreadPool(10);
for(int i = 0 ; i < 10 ; i ++){
ex.submit(demo);
}
System.err.println("Main異步開始進(jìn)入等待");
end.await();//等待
System.err.println("CountDownLatch 已全部執(zhí)行完畢 !");
ex.shutdown();
System.err.println("測(cè)試線程池執(zhí)行完畢 !");
}
}
執(zhí)行結(jié)果 例:
Main異步開始進(jìn)入等待
pool-1-thread-10 線程已經(jīng)執(zhí)行完畢
pool-1-thread-7 線程已經(jīng)執(zhí)行完畢
pool-1-thread-5 線程已經(jīng)執(zhí)行完畢
pool-1-thread-9 線程已經(jīng)執(zhí)行完畢
pool-1-thread-8 線程已經(jīng)執(zhí)行完畢
pool-1-thread-1 線程已經(jīng)執(zhí)行完畢
pool-1-thread-4 線程已經(jīng)執(zhí)行完畢
pool-1-thread-3 線程已經(jīng)執(zhí)行完畢
pool-1-thread-2 線程已經(jīng)執(zhí)行完畢
pool-1-thread-6 線程已經(jīng)執(zhí)行完畢
CountDownLatch 已全部執(zhí)行完畢 !
測(cè)試線程池執(zhí)行完畢 !
代碼解讀
A. main函數(shù)創(chuàng)建了一個(gè)線程池為10的對(duì)象库倘,
循環(huán)執(zhí)行10次CountDownLatchDemo demo對(duì)象
B. main執(zhí)行end.await();main主線程被臨時(shí)掛起惫叛,等待10個(gè)線程執(zhí)行完畢颖御。
C. 線程執(zhí)行end.countDown();標(biāo)示當(dāng)前線程已經(jīng)執(zhí)行完畢
D. 當(dāng)全部線程執(zhí)行完畢后拢蛋,main繼續(xù)執(zhí)行剩余的業(yè)務(wù)代碼
參考:《實(shí)戰(zhàn) Java 高并發(fā)程序設(shè)計(jì)》這本書侦镇。