標籤:
CountDownLatch
1、類介紹
一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。用給定的計數 初始化 CountDownLatch。由於調用了 countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的線程,await 的所有後續調用都將立即返回。這種現象只出現一次——計數無法被重設。 一個線程(或者多個), 等待另外N個線程完成某個事情之後才能執行
2、使用情境
在一些應用場合中,需要等待某個條件達到要求後才能做後面的事情;同時當線程都完成後也會觸發事件,以便進行後面的操作。 這個時候就可以使用CountDownLatch。CountDownLatch最重要的方法是countDown()和await(),前者主要是倒數一次,後者是等待倒數到0,如果沒有到達0,就只有阻塞等待了。3、方法說明 await
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
-
使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷或超出了指定的等待時間。如果當前計數為零,則此方法立刻返回
true
值。
如果當前計數大於零,則出於線程調度目的,將禁用當前線程,且在發生以下三種情況之一前,該線程將一直處於休眠狀態:
countDown()
方法,計數到達零;或者
- 其他某個線程中斷當前線程;或者
- 已超出指定的等待時間。
如果計數到達零,則該方法返回 true
值。
- 在進入此方法時已經設定了該線程的中斷狀態;或者
- 在等待時被中斷,
InterruptedException
,並且清除當前線程的已中止狀態。如果超出了指定的等待時間,則傳回值為 false
。如果該時間小於等於零,則此方法根本不會等待。
-
-
參數:
-
timeout
- 要等待的最長時間
-
unit
-
timeout
參數的時間單位。
-
返回:
-
如果計數到達零,則返回
true
;如果在計數到達零之前超過了等待時間,則返回
false
-
拋出:
-
InterruptedException
- 如果當前線程在等待時被中斷
-
import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CountDownLatchTest { // 類比了100米賽跑,10名選手已經準備就緒,只等裁判一聲令下。當所有人都到達終點時,比賽結束。 public static void main(String[] args) throws InterruptedException { // 開始的倒數鎖 final CountDownLatch begin = new CountDownLatch(1); // 結束的倒數鎖 final CountDownLatch end = new CountDownLatch(10); // 十名選手 final ExecutorService exec = Executors.newFixedThreadPool(10); for (int index = 0; index < 10; index++) { final int NO = index + 1; Runnable run = new Runnable() { public void run() { try { // 如果當前計數為零,則此方法立即返回。 // 等待 begin.await(); Thread.sleep((long) (Math.random() * 10000)); System.out.println("No." + NO + " arrived"); } catch (InterruptedException e) { } finally { // 每個選手到達終點時,end就減一 end.countDown(); } } }; exec.submit(run); } System.out.println("Game Start"); // begin減一,開始遊戲 begin.countDown(); // 等待end變為0,即所有選手到達終點 end.await(); System.out.println("Game Over"); exec.shutdown(); }}
輸出結果:
Game StartNo.7 arrivedNo.5 arrivedNo.9 arrivedNo.4 arrivedNo.8 arrivedNo.2 arrivedNo.3 arrivedNo.6 arrivedNo.1 arrivedNo.10 arrivedGame Over
轉載地址:http://www.itzhai.com/the-introduction-and-use-of-a-countdownlatch.html
Java --CountDownLatch簡介