java併發程式設計專題(八)----(JUC)例項講解CountDownLatch
CountDownLatch 是一個非常實用的多執行緒控制工具類。” Count Down ” 在英文中意為倒計數, Latch 為門問的意思。如果翻譯成為倒計數門閥, 我想大家都會覺得不知所云吧! 因此,這裡簡單地稱之為倒計數器。在這裡, 門問的含義是:把門鎖起來,不讓裡面的執行緒跑出來。因此,這個工具通常用來控制執行緒等待,它可以讓某一個執行緒等待直到倒計時結束, 再開始執行。
CountDown Latch 的建構函式接收一個整數作為引數,即當前這個計數器的計數個數。
public CountDownLatch(int count)
CountDownLatch是一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。一個CountDownLatch初始化為給定的計數 。 呼叫await方法阻塞,直到當前計數為零,在呼叫countDown()方法之後,所有等待的執行緒被釋放,任何後續呼叫await立即返回。 這是一次性的現象 - 計數不能重置。 如果需要重置計數,考慮使用CyclicBarrier ,CyclicBarrier的計數器可以被重置後使用,因此它被稱為是迴圈的barrier。
主要方法:
// 使當前執行緒在鎖存器倒計數至零之前一直等待,除非執行緒被中斷。 void await() // 使當前執行緒在鎖存器倒計數至零之前一直等待,除非執行緒被中斷或超出了指定的等待時間。 boolean await(long timeout,TimeUnit unit) // 遞減鎖存器的計數,如果計數到達零,則釋放所有等待的執行緒。 void countDown() // 返回當前計數。 long getCount()
我們來看一個例子:
public class TestCountDownLatch { private static final int RUNNER_NUMBER = 5; // 運動員個數 private static final Random RANDOM = new Random(); public static void main(String[] args) { // 用於判斷髮令之前運動員是否已經完全進入準備狀態,需要等待5個運動員,所以引數為5 CountDownLatch readyLatch = new CountDownLatch(RUNNER_NUMBER); // 用於判斷裁判是否已經發令,只需要等待一個裁判,所以引數為1 CountDownLatch startLatch = new CountDownLatch(1); for (int i = 0; i < RUNNER_NUMBER; i++) { Thread t = new Thread(new Runner((i + 1) + "號運動員",readyLatch,startLatch)); t.start(); } try { readyLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } startLatch.countDown(); System.out.println("裁判:所有運動員準備完畢,開始..."); } static class Runner implements Runnable { private CountDownLatch readyLatch; private CountDownLatch startLatch; private String name; public Runner(String name,CountDownLatch readyLatch,CountDownLatch startLatch) { this.name = name; this.readyLatch = readyLatch; this.startLatch = startLatch; } public void run() { int readyTime = RANDOM.nextInt(1000); System.out.println(name + ":我需要" + readyTime + "秒時間準備."); try { Thread.sleep(readyTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ":我已經準備完畢."); readyLatch.countDown(); try { startLatch.await(); // 等待裁判發開始命令 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ":開跑..."); } } }
列印結果:
1號運動員:我需要547秒時間準備.
2號運動員:我需要281秒時間準備.
4號運動員:我需要563秒時間準備.
5號運動員:我需要916秒時間準備.
3號運動員:我需要461秒時間準備.
2號運動員:我已經準備完畢.
3號運動員:我已經準備完畢.
1號運動員:我已經準備完畢.
4號運動員:我已經準備完畢.
5號運動員:我已經準備完畢.
裁判:所有運動員準備完畢,開始...
3號運動員:開跑...
2號運動員:開跑...
1號運動員:開跑...
4號運動員:開跑...
5號運動員:開跑...Process finished with exit code 0
注意:計數器必須大於等於0,只是等於0時候,計數器就是零,呼叫await方法時不會阻塞當前執行緒。
以上就是java併發程式設計專題(八)----(JUC)例項講解CountDownLatch的詳細內容,更多關於java juc CountDownLatch的資料請關注我們其它相關文章!