CountDownLatch的理解和使用

2022-01-20 06:33:57 字數 1739 閱讀 2759

countdownlatch概念

countdownlatch是乙個同步工具類,用來協調多個執行緒之間的同步,或者說起到執行緒之間的通訊(而不是用作互斥的作用)。

countdownlatch能夠使乙個執行緒在等待另外一些執行緒完成各自工作之後,再繼續執行。使用乙個計數器進行實現。計數器初始值為執行緒的數量。當每乙個執行緒完成自己任務後,計數器的值就會減一。當計數器的值為0時,表示所有的執行緒都已經完成一些任務,然後在countdownlatch上等待的執行緒就可以恢復執行接下來的任務。

countdownlatch的用法

countdownlatch典型用法:1、某一線程在開始執行前等待n個執行緒執行完畢。將countdownlatch的計數器初始化為new countdownlatch(n),每當乙個任務執行緒執行完畢,就將計數器減1 countdownlatch.countdown(),當計數器的值變為0時,在countdownlatch上await()的執行緒就會被喚醒。乙個典型應用場景就是啟動乙個服務時,主線程需要等待多個元件載入完畢,之後再繼續執行。

countdownlatch典型用法:2、實現多個執行緒開始執行任務的最大並行性。注意是並行性,不是併發,強調的是多個執行緒在某一時刻同時開始執行。類似於賽跑,將多個執行緒放到起點,等待發令槍響,然後同時開跑。做法是初始化乙個共享的countdownlatch(1),將其計算器初始化為1,多個執行緒在開始執行任務前首先countdownlatch.await(),當主線程呼叫countdown()時,計數器變為0,多個執行緒同時被喚醒。

countdownlatch的不足

countdownlatch是一次性的,計算器的值只能在構造方法中初始化一次,之後沒有任何機制再次對其設定值,當countdownlatch使用完畢後,它不能再次被使用。

countdownlatch(倒計時計算器)使用說明

方法說明

public void countdown()

遞減鎖存器的計數,如果計數到達零,則釋放所有等待的執行緒。如果當前計數大於零,則將計數減少.

public boolean await(long timeout,timeunit unit) throws interruptedexception

使當前執行緒在鎖存器倒計數至零之前一直等待,除非執行緒被中斷或超出了指定的等待時間。如果當前計數為零,則此方法立刻返回true值。

如果當前計數大於零,則出於執行緒排程目的,將禁用當前執行緒,且在發生以下三種情況之一前,該執行緒將一直出於休眠狀態:

由於呼叫countdown()方法,計數到達零;或者其他某個執行緒中斷當前執行緒;或者已超出指定的等待時間。

引數:timeout-要等待的最長時間

unit-timeout 引數的時間單位

返回:如果計數到達零,則返回true;如果在計數到達零之前超過了等待時間,則返回false

丟擲:interruptedexception-如果當前執行緒在等待時被中斷

例子1:

主線程等待子執行緒執行完成在執行

例子2:

百公尺賽跑,4名運動員選手到達場地等待裁判口令,裁判一聲口令,選手聽到後同時起跑,當所有選手到達終點,裁判進行彙總排名

CountDownLatch的簡單理解

countdownlatch是乙個同步工具類,用來協調多個執行緒之間的同步,或者說起到執行緒之間的通訊 而不是用作互斥的作用 countdownlatch能夠使乙個執行緒在等待另外一些執行緒完成各自工作之後,再繼續執行。使用乙個計數器進行實現。計數器初始值為執行緒的數量。當每乙個執行緒完成自己任務後...

CountDownLatch 的簡單理解

countdownlatch是乙個同步工具類,用來協調多個執行緒之間的同步,或者說起到執行緒之間的通訊 而不是用作互斥的作用 countdownlatch能夠使乙個執行緒在等待另外一些執行緒完成各自工作之後,再繼續執行。使用乙個計數器進行實現。計數器初始值為執行緒的數量。當每乙個執行緒完成自己任務後...

CountDownLatch類的分析

countdownlatch 實現 乙個或多個執行緒 等待 其他一組執行緒的操作執行完成。1 內部類 sync extends abstractqueuedsynchronizer 繼承了aqs,並實現了tryacquireshared,tryreleaseshared方法,同時擁有構造方法 syn...