CountDownLatch
1、類介紹
壹個同步輔助類,在完成壹組正在其他線程中執行的操作之前,它允許壹個或多個線程壹直等待。用給定的計數 初始化 CountDownLatch。由於調用了 countDown() 方法,所以在當前計數到達零之前,await 方法會壹直受阻塞。之後,會釋放所有等待的線程,await 的所有後續調用都將立即返回。這種現象只出現壹次——計數無法被重置。?壹個線程(或者多個), 等待另外N個線程完成某個事情之後才能執行
2、使用場景
在壹些應用場合中,需要等待某個條件達到要求後才能做後面的事情;同時當線程都完成後也會觸發事件,以便進行後面的操作。 這個時候就可以使用CountDownLatch。CountDownLatch最重要的方法是countDown()和await(),前者主要是倒數壹次,後者是等待倒數到0,如果沒有到達0,就只有阻塞等待了。
3、方法說明
countDown
public void countDown()
遞減鎖存器的計數,如果計數到達零,則釋放所有等待的線程。如果當前計數大於零,則將計數減少。如果新的計數為零,出於線程調度目的,將重新啟用所有的等待線程。
如果當前計數等於零,則不發生任何操作。
await
public boolean await(long?timeout,
TimeUnit?unit)
?throws InterruptedException
使當前線程在鎖存器倒計數至零之前壹直等待,除非線程被中斷或超出了指定的等待時間。如果當前計數為零,則此方法立刻返回?true?值。
如果當前計數大於零,則出於線程調度目的,將禁用當前線程,且在發生以下三種情況之壹前,該線程將壹直處於休眠狀態:
如果計數到達零,則該方法返回?true?值。
如果當前線程:
則拋出?InterruptedException,並且清除當前線程的已中斷狀態。如果超出了指定的等待時間,則返回值為?false。如果該時間小於等於零,則此方法根本不會等待。
在進入此方法時已經設置了該線程的中斷狀態;或者
在等待時被中斷,
由於調用?countDown()?方法,計數到達零;或者
其他某個線程中斷當前線程;或者
已超出指定的等待時間。
參數:
timeout?- 要等待的最長時間
unit?-?timeout?參數的時間單位。
返回:
如果計數到達零,則返回?true;如果在計數到達零之前超過了等待時間,則返回?false
拋出:
InterruptedException?- 如果當前線程在等待時被中斷
具體實例如下: