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...