countdownlatch是一個同步工具類,用來協調多個線程之間的同步,或者說起到線程之間的通信(而不是用作互斥的作用)。 countdownlatch能夠使一個線程在等待另外一些線程完成各自工作之後,再繼續執行。使用一個計數器進行實作。計數器初始值為線程的數量。當每一個線程完成自己任務後,計數器的值就會減一。當計數器的值為0時,表示所有的線程都已經完成一些任務,然後在countdownlatch上等待的線程就可以恢複執行接下來的任務。
某一線程在開始運作前等待n個線程執行完畢。将countdownlatch的計數器初始化為new countdownlatch(n),每當一個任務線程執行完畢,就将計數器減1 countdownlatch.countdown(),當計數器的值變為0時,在countdownlatch上await()的線程就會被喚醒。一個典型應用場景就是啟動一個服務時,主線程需要等待多個元件加載完畢,之後再繼續執行。
實作多個線程開始執行任務的最大并行性。注意是并行性,不是并發,強調的是多個線程在某一時刻同時開始執行。類似于賽跑,将多個線程放到起點,等待發令槍響,然後同時開跑。做法是初始化一個共享的countdownlatch(1),将其電腦初始化為1,多個線程在開始執行任務前首先countdownlatch.await(),當主線程調用countdown()時,計數器變為0,多個線程同時被喚醒。
countdownlatch是一次性的,電腦的值隻能在構造方法中初始化一次,之後沒有任何機制再次對其設定值,當countdownlatch使用完畢後,它不能再次被使用。
方法說明
public void countdown() 遞減鎖存器的計數,如果計數到達零,則釋放所有等待的線程。如果目前計數大于零,則将計數減少. public boolean await(long timeout,timeunit unit) throws interruptedexception 使目前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷或超出了指定的等待時間。如果目前計數為零,則此方法立刻傳回true值。
如果目前計數大于零,則出于線程排程目的,将禁用目前線程,且在發生以下三種情況出現之前,該線程将一直出于休眠狀态:
1、由于調用countdown()方法,計數到達零;
2、其他某個線程中斷目前線程;
3、已超await中指定的逾時等待時間。
如果計數到達零,則該方法傳回true值。
如果目前線程,在進入此方法時已經設定了該線程的中斷狀态;或者在等待時被中斷,則抛出interruptedexception,并且清除目前線程的已中斷狀态。
如果超出了指定的等待時間,則傳回值為false。如果該時間小于等于零,則該方法根本不會等待。
參數:
timeout-要等待的最長時間
unit-timeout 參數的時間機關
傳回:
如果計數到達零,則傳回true;如果在計數到達零之前超過了等待時間,則傳回false
抛出:
interruptedexception-如果目前線程在等待時被中斷
countdownlatch 的使用示例一
countdownlatch 的使用示例二