執行緒併發控制 CountDownLatch閉鎖

2021-08-28 19:22:27 字數 1799 閱讀 5195

latch中文含義有門閂之意,閉鎖的作用相當於一扇門:countdownlatch能夠使乙個執行緒在等待另外一些執行緒完成各自工作之後,再繼續執行。使用乙個計數器進行實現。計數器初始值為執行緒的數量。當每乙個執行緒完成自己任務後,計數器的值就會減一。當計數器的值為0時,表示所有的執行緒都已經完成了任務,然後在countdownlatch上等待的執行緒就可以恢復執行任務。

確保某個計算在其需要的所有資源都被初始化之後才繼續執行。

確保某個服務在其依賴的所有其他服務都已經啟動之後才啟動。

等待直到某個操作的所有參與者都就緒再繼續執行。

需求1:計算10個學生搶蘋果的總時間。

問題**:

public class nocountdownlatchdemo 

long end = system.currenttimemillis();

system.out.println("共耗費" + (end - begin) + "ms時間");

}} @override

public void run() }}

}}

測試結果:

問題分析:

耗費總時間應該是蘋果搶完之後才計算出來的,現在還在搶的過程中就計算出來了,所以我們需要在計算消耗時間之前設定乙個關卡,判斷搶蘋果執行緒是否都結束,如果都結束了就執行時間的計算。

分析如圖所示:

正確**:

public class countdownlatchdemo 

latch.await();//不讓main執行緒往下執行,直到吃蘋果執行緒都執行完畢,才放行

long end = system.currenttimemillis();

system.out.println("共耗費"+(end-begin)+"ms時間");

}} private countdownlatch latch;

this.latch = latch;

}@override

public void run() }}

} finally }}

需求2:10個運動員準備賽跑,他們等待裁判一聲令下就開始同時跑,當最後乙個人通過終點的時候,比賽結束。

public class countdownlatchdemo2 

thread.sleep(3000);//起跑線上等待3秒,3,2,1

begin.countdown(); // 裁判一聲令下開始跑

end.await();// 所有選手到達終點

long endtime = system.currenttimemillis();

system.out.println("共耗費" + (endtime - begintime) + "ms時間");

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

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

java 多執行緒的併發控制

synchronized必須鎖的是物件,基本資料型別的變數不能當作物件鎖。要保證多執行緒使用的是同乙個互斥鎖 物件鎖 才能進行同步。死鎖的兩種情況 1 多個執行緒共用同乙個物件鎖,互相等待。2 互相持有對方所需的資源 即每個執行緒都需要同時拿到多個資源才能繼續執行,而多個執行緒都處於 各持有一部分,...

shell佇列實現執行緒併發控制

請看原文 需求 併發檢測1000臺web伺服器狀態 或者併發為1000臺web伺服器分發檔案等 如何用shell實現?方案一 這應該是大多數人都第一時間想到的方法吧 思路 乙個for迴圈1000次,順序執行1000次任務。bin bash start time date s 定義指令碼執行的開始時間...