CountDownLatch是一個同步輔助類,猶如倒計時計數(shù)器,創(chuàng)建對象時通過構(gòu)造方法設(shè)置初始值,調(diào)用CountDownLatch對象的await()方法則處于等待狀態(tài),調(diào)用countDown()方法就將計數(shù)器減1,當(dāng)計數(shù)到達(dá)0時,則所有等待者或單個等待者開始執(zhí)行。
1 package com.thread; 2 import java.util.concurrent.CountDownLatch; 3 import java.util.concurrent.CyclicBarrier; 4 import java.util.concurrent.ExecutorService; 5 import java.util.concurrent.Executors; 6 /** 7 * 8 * @author Administrator 9 *該程序用來模擬發(fā)送命令與執(zhí)行命令,主線程代表指揮官,新建3個線程代表戰(zhàn)士,戰(zhàn)士一直等待著指揮官下達(dá)命令, 10 *若指揮官沒有下達(dá)命令,則戰(zhàn)士們都必須等待。一旦命令下達(dá),戰(zhàn)士們都去執(zhí)行自己的任務(wù),指揮官處于等待狀態(tài),戰(zhàn)士們?nèi)蝿?wù)執(zhí)行完畢則報告給 11 *指揮官,指揮官則結(jié)束等待。 12 */ 13 public class CountdownLatchTest { 14 15 public static void main(String[] args) { 16 ExecutorService service = Executors.newCachedThreadPool(); //創(chuàng)建一個線程池 17 final CountDownLatch cdOrder = new CountDownLatch(1);//指揮官的命令,設(shè)置為1,指揮官一下達(dá)命令,則cutDown,變?yōu)?,戰(zhàn)士們執(zhí)行任務(wù) 18 final CountDownLatch cdAnswer = new CountDownLatch(3);//因?yàn)橛腥齻€戰(zhàn)士,所以初始值為3,每一個戰(zhàn)士執(zhí)行任務(wù)完畢則cutDown一次,當(dāng)三個都執(zhí)行完畢,變?yōu)?,則指揮官停止等待。 19 for(int i=0;i<3;i++){ 20 Runnable runnable = new Runnable(){ 21 public void run(){ 22 try { 23 System.out.println("線程" + Thread.currentThread().getName() + 24 "正準(zhǔn)備接受命令"); 25 cdOrder.await(); //戰(zhàn)士們都處于等待命令狀態(tài) 26 System.out.println("線程" + Thread.currentThread().getName() + 27 "已接受命令"); 28 Thread.sleep((long)(Math.random()*10000)); 29 System.out.println("線程" + Thread.currentThread().getName() + 30 "回應(yīng)命令處理結(jié)果"); 31 cdAnswer.countDown(); //任務(wù)執(zhí)行完畢,返回給指揮官,cdAnswer減1。 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 }; 37 service.execute(runnable);//為線程池添加任務(wù) 38 } 39 try { 40 Thread.sleep((long)(Math.random()*10000)); 41 42 System.out.println("線程" + Thread.currentThread().getName() + 43 "即將發(fā)布命令"); 44 cdOrder.countDown(); //發(fā)送命令,cdOrder減1,處于等待的戰(zhàn)士們停止等待轉(zhuǎn)去執(zhí)行任務(wù)。 45 System.out.println("線程" + Thread.currentThread().getName() + 46 "已發(fā)送命令,正在等待結(jié)果"); 47 cdAnswer.await(); //命令發(fā)送后指揮官處于等待狀態(tài),一旦cdAnswer為0時停止等待繼續(xù)往下執(zhí)行 48 System.out.println("線程" + Thread.currentThread().getName() + 49 "已收到所有響應(yīng)結(jié)果"); 50 } catch (Exception e) { 51 e.printStackTrace(); 52 } 53 service.shutdown(); //任務(wù)結(jié)束,停止線程池的所有線程 54 55 } 56 }
線程pool-1-thread-2正準(zhǔn)備接受命令 線程pool-1-thread-3正準(zhǔn)備接受命令 線程pool-1-thread-1正準(zhǔn)備接受命令 線程main即將發(fā)布命令 線程pool-1-thread-2已接受命令 線程pool-1-thread-3已接受命令 線程pool-1-thread-1已接受命令 線程main已發(fā)送命令,正在等待結(jié)果 線程pool-1-thread-2回應(yīng)命令處理結(jié)果 線程pool-1-thread-1回應(yīng)命令處理結(jié)果 線程pool-1-thread-3回應(yīng)命令處理結(jié)果 線程main已收到所有響應(yīng)結(jié)果
|
|