天天看點

多線程工具CountDownLatch的使用

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 的使用示例二

繼續閱讀