多線程之CountDownLatch工具類
CountDownLatch 是一個通用同步工具,它有很多用途。將計數 1 初始化的 CountDownLatch 用作一個簡單的開/關鎖存器,或入口:在通過調用countDown() 的線程打開入口前,所有調用 await 的線程都一直在入口處等待。用 N 初始化的 CountDownLatch 可以使一個線程在N 個線程完成某項操作之前一直等待,或者使其在某項操作完成 N 次之前一直等待。
CountDownLatch 的一個有用特性是,它不要求調用 countDown 方法的線程等到計數到達零時才繼續,而在所有線程都能通過之前,它只是阻止任何線程繼續通過一個await。
使用場景:
可以實現一個人(也可以是多個人)等待其他所有人來通知他,也可以實現一個人通知多個人。
類似裁判一聲口令,所有運動員開始跑步,所有運動員到達終點后需要裁判員報告成績,裁判員公布結果。
實現如下:
package andy.thread.test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author Zhang,Tianyou
* @version 2014年11月9日 下午2:34:34
*/
public class CountdownLatchTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CountDownLatch cdOrder = new CountDownLatch(1);
final CountDownLatch cdAnswer = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
Runnable runnable = new Runnable() {
public void run() {
try {
System.out.println("線程"
+ Thread.currentThread().getName() + "正準備接受命令");
cdOrder.await();
System.out.println("線程"
+ Thread.currentThread().getName() + "已接受命令");
Thread.sleep((long) (Math.random() * 10000));
System.out
.println("線程"
+ Thread.currentThread().getName()
+ "回應命令處理結果");
cdAnswer.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
try {
Thread.sleep((long) (Math.random() * 10000));
System.out.println("線程" + Thread.currentThread().getName()
+ "即將發布命令");
cdOrder.countDown();
System.out.println("線程" + Thread.currentThread().getName()
+ "已發送命令,正在等待結果");
cdAnswer.await();
System.out.println("線程" + Thread.currentThread().getName()
+ "已收到所有響應結果");
} catch (Exception e) {
e.printStackTrace();
}
service.shutdown();
}
}
運行結果如下:
線程pool-1-thread-2正準備接受命令
線程pool-1-thread-1正準備接受命令
線程pool-1-thread-3正準備接受命令
線程main即將發布命令
線程main已發送命令,正在等待結果
線程pool-1-thread-3已接受命令
線程pool-1-thread-2已接受命令
線程pool-1-thread-1已接受命令
線程pool-1-thread-1回應命令處理結果
線程pool-1-thread-2回應命令處理結果
線程pool-1-thread-3回應命令處理結果
線程main已收到所有響應結果
本文由用戶 bbw3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!