CountDownLatch是一個同步輔助類,猶如倒計時計數器,創建對象時通過構造方法設置初始值,調用CountDownLatch對象的await()方法則處於等待狀態,調用countDown()方法就將計數器減1,當計數到達0時,則所有等待者或單個等待者開始執行。
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 *該程序用來模擬發送命令與執行命令,主線程代表指揮官,新建3個線程代表戰士,戰士一直等待着指揮官下達命令, 10 *若指揮官沒有下達命令,則戰士們都必須等待。一旦命令下達,戰士們都去執行自己的任務,指揮官處於等待狀態,戰士們任務執行完畢則報告給 11 *指揮官,指揮官則結束等待。 12 */ 13 public class CountdownLatchTest { 14 15 public static void main(String[] args) { 16 ExecutorService service = Executors.newCachedThreadPool(); //創建一個線程池 17 final CountDownLatch cdOrder = new CountDownLatch(1);//指揮官的命令,設置為1,指揮官一下達命令,則cutDown,變為0,戰士們執行任務 18 final CountDownLatch cdAnswer = new CountDownLatch(3);//因為有三個戰士,所以初始值為3,每一個戰士執行任務完畢則cutDown一次,當三個都執行完畢,變為0,則指揮官停止等待。 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(); //戰士們都處於等待命令狀態 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(); //任務執行完畢,返回給指揮官,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 "即將發布命令"); 44 cdOrder.countDown(); //發送命令,cdOrder減1,處於等待的戰士們停止等待轉去執行任務。 45 System.out.println("線程" + Thread.currentThread().getName() + 46 "已發送命令,正在等待結果"); 47 cdAnswer.await(); //命令發送后指揮官處於等待狀態,一旦cdAnswer為0時停止等待繼續往下執行 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即將發布命令 線程pool-1-thread-2已接受命令 線程pool-1-thread-3已接受命令 線程pool-1-thread-1已接受命令 線程main已發送命令,正在等待結果 線程pool-1-thread-2回應命令處理結果 線程pool-1-thread-1回應命令處理結果 線程pool-1-thread-3回應命令處理結果 線程main已收到所有響應結果