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