併發流程工具CountDownLatch解析

2021-10-06 04:24:52 字數 2546 閱讀 2100

countdownlatch是乙個執行緒併發流程工具,它允許乙個或者多個執行緒阻塞直到一些執行緒執行完畢,才會繼續執行,countdownlatch會存在乙個計數器,當 await方法呼叫,那麼後面的執行緒都會被阻塞,直到由於countdown()方法的呼叫而導致當前計數達到零,後續被阻塞的執行緒才會繼續執行,這個計數器是一次性的,不能重置,如果需要重置計數,請考慮使用cyclicbarrier

countdownlatch內部是通過aqs實現併發流程控制,在的內部有乙個aqs類

/**

* 用於控制 countdownlatch.

* 用aqs的狀態代替計數器.

*/private

static

final

class

sync

extends

abstractqueuedsynchronizer

//獲得當前的狀態。同樣調的是父類的方法

intgetcount()

protected

inttryacquireshared

(int acquires)

protected

boolean

tryreleaseshared

(int releases)

}}

//父類方法用於設定狀態

/** * 設定aqs狀態

* */

protected

final

void

setstate

(int newstate)

//用於阻塞後續所有的執行緒

public

void

await()

throws interruptedexception

//阻塞後續執行緒,直到計數器為0或者超時

public

boolean

await

(long timeout, timeunit unit)

throws interruptedexception

/**

** 計數器減一,當計數器為0的時候後續阻塞執行緒會繼續執行

** 如果計數器已經為0,呼叫此方法不會做任何事

*/public

void

countdown()

/**

* 返回計數器

*/public

long

getcount()

構造方法

/**

* 初始化乙個物件,並設定計數器數量和aqs的狀態量

* 如果傳入乙個負數回報引數異常

*/public

countdownlatch

(int count)

案例

/**

* 描述: 模擬乙個連隊,所有人都到齊了才統一出發

*/public

class

countdownlatchdemo1

catch

(interruptedexception e)

finally}}

; service.

submit

(runnable);}

system.out.

println

("所有人都到齊了.....");

latch.

await()

; system.out.

println

("所有人都到齊了,出發!!!!!。");

}}

/**

* 描述: 模擬100公尺跑步,5名選手都準備好了,只等裁判員一聲令下,所有人同時開始跑步。當所有人都到終點後,比賽結束。

*/public

class

countdownlatchdemo1and2

catch

(interruptedexception e)

finally}}

; service.

submit

(runnable);}

//裁判員檢查發令槍...

thread.

sleep

(5000);

system.out.

println

("發令槍響,比賽開始!");

begin.

countdown()

; end.

await()

; system.out.

println

("所有人到達終點,比賽結束");

}}

控制併發流程

控制併發流程的工具類,讓執行緒之間相互合作。比如讓執行緒a等待執行緒b執行完再執行合作策略 用來限制有限資源的使用情況 初始化semaphore指定許可證的數量 acquire獲取許可證 release釋放許可證 tryacquire timeout 檢查有沒有空閒的許可證,不阻塞 等到所有執行緒都...

控制併發流程

通過控制併發的工具類,幫助程式設計師更容易讓程式之間相互合作,來滿足業務邏輯 質檢,5個工人檢查,所有都通過,才通過檢查 public class countdownlatchdemo1 catch interruptedexception e finally service.submit runn...

玩轉併發 多執行緒Count Down設計模式

count down設計模式其實也叫做latch 閥門 設計模式。當若干個執行緒併發執行完某個特定的任務,然後等到所有的子任務都執行結束之後再統一彙總。jdk自帶countdownlatch public static void main string args throws interrupted...