|
CountDownLatch是一個同步輔助類,猶如倒計時計數(shù)器,創(chuàng)建對象時通過構造方法設置初始值,調用CountDownLatch對象的await()方法則處于等待狀態(tài),調用countDown()方法就將計數(shù)器減1,當計數(shù)到達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)士一直等待著指揮官下達命令, 10 *若指揮官沒有下達命令,則戰(zhàn)士們都必須等待。一旦命令下達,戰(zhàn)士們都去執(zhí)行自己的任務,指揮官處于等待狀態(tài),戰(zhàn)士們任務執(zhí)行完畢則報告給 11 *指揮官,指揮官則結束等待。 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);//指揮官的命令,設置為1,指揮官一下達命令,則cutDown,變?yōu)?,戰(zhàn)士們執(zhí)行任務 18 final CountDownLatch cdAnswer = new CountDownLatch(3);//因為有三個戰(zhàn)士,所以初始值為3,每一個戰(zhàn)士執(zhí)行任務完畢則cutDown一次,當三個都執(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 "正準備接受命令"); 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 "回應命令處理結果"); 31 cdAnswer.countDown(); //任務執(zhí)行完畢,返回給指揮官,cdAnswer減1。 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 }; 37 service.execute(runnable);//為線程池添加任務 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)士們停止等待轉去執(zhí)行任務。 45 System.out.println("線程" + Thread.currentThread().getName() + 46 "已發(fā)送命令,正在等待結果"); 47 cdAnswer.await(); //命令發(fā)送后指揮官處于等待狀態(tài),一旦cdAnswer為0時停止等待繼續(xù)往下執(zhí)行 48 System.out.println("線程" + Thread.currentThread().getName() + 49 "已收到所有響應結果"); 50 } catch (Exception e) { 51 e.printStackTrace(); 52 } 53 service.shutdown(); //任務結束,停止線程池的所有線程 54 55 } 56 }
線程pool-1-thread-2正準備接受命令 線程pool-1-thread-3正準備接受命令 線程pool-1-thread-1正準備接受命令 線程main即將發(fā)布命令 線程pool-1-thread-2已接受命令 線程pool-1-thread-3已接受命令 線程pool-1-thread-1已接受命令 線程main已發(fā)送命令,正在等待結果 線程pool-1-thread-2回應命令處理結果 線程pool-1-thread-1回應命令處理結果 線程pool-1-thread-3回應命令處理結果 線程main已收到所有響應結果
|
|
|