CountDownLatch深度剖析

2022-08-23 13:24:15 字數 1516 閱讀 7817

場景引入

日常開發中,有個需求,要求主線程開啟多個執行緒去並行執行任務,並且主線程需要等待所有的子執行緒執行完成後進行彙總。我們很容易找到 jion()方法來實現這個功能

缺點:由於工作中,我們不會直接建立執行緒,一般都是交給執行緒池處理,那麼我們就沒法對執行緒池裡的執行緒呼叫join()方法了。

2.需求公升級

主線程不必等所有的子執行緒全部執行完成就可以進行彙總,並且子執行緒還能執行其他的無關的功能。查閱juc包,我們發現countdownlatch、cyclicbarrier、semaphore均可以實現這個功能。

今天我們主要學習一下countdownlatch

3. join 和 countdownlatch比較

4. 原始碼走讀

public countdownlatch(int

count)

//

呼叫該方法,計數器的值遞減,當計數器的值為0則喚醒所有因呼叫該方法而阻塞的執行緒,

//否則什麼也不做

public

void

countdown()

public

final

boolean releaseshared(int

arg)

return

false

; }

protected

boolean tryreleaseshared(int

releases)

}

public

void await() throws

interruptedexception

public

final

void acquiresharedinterruptibly(int

arg)

throws

interruptedexception

//單純的判斷aqs的state是否為0

protected

int tryacquireshared(int

acquires)

5. 總結

countdownlatch基於aqs實現(countdownlatch靜態內部類sync)。使用aqs的狀態值state來存放計數器的值。首先在初始化的時候,設定狀態值(計數器的值),當多個執行緒呼叫countdown()方法時,實際上是對aqs進行原子性遞減。當有執行緒呼叫await()方法時後,該執行緒會被放入aqs的阻塞佇列等待計數器為0再返回。其他執行緒呼叫 countdown 方法讓計數器值遞減1,當計數器的值變為0時,當前執行緒還要呼叫aqs的 doreleaseshared 方法來啟用由於呼叫 await 方法而阻塞的執行緒。

多執行緒 CountDownLatch

countdownlatch 允許乙個或多個執行緒等待其他執行緒完成操作。應用場景 假如有這樣乙個需求,當我們需要解析乙個excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析乙個sheet裡的資料,等到所有的sheet都解析完之後,程式需要提示解析完成。在這個需求中,要實現主線程...

執行緒同步 CountDownLatch

應用場景 有乙個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。假如我們這個想要繼續往下執行的任務呼叫乙個countdownlatch物件的await 方法,其他的任務執行完自己的任務後呼叫同乙個countdownlatch物件上的countdown 方法,這個呼叫await ...

CountDownLatch 併發測試

countdownlatch,乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或多個執行緒一直等待。主要方法 public countdownlatch int count public voidcountdown public voidawait throws interrup...