遞減計數門閂CountDownLatch

2022-09-19 18:06:08 字數 1462 閱讀 5827

countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作。

相當於是乙個門栓,一開始是關閉的,所有希望通過該門的執行緒都需要等待,等待計數器變為0後,門栓開啟,等待的所有執行緒都可以通過,它是一次性的,開啟後就不能再關上了。

countdownlatch裡有乙個計數,這個計數通過構造方法進行傳遞:

public countdownlatch(int count)

多個執行緒可以基於這個計數進行協作,它的主要方法有:

public void await() throws interruptedexception

public boolean await(long timeout, timeunit unit) throws interruptedexception

public void countdown()

await檢查計數是否為0,如果大於0,就等待,await可以被中斷,也可以設定最長等待時間。countdown檢查計數,如果已經為0,直接返回,否則減少計數,如果新的計數變為0,則喚醒所有等待的執行緒。

要實現主線程等待所有執行緒完成操作,最簡單的做法是使用join()方法

public class joincountdownlatchtest 

});thread parser2 = new thread(new runnable()

});parser1.start();

parser2.start();

parser1.join();

parser2.join();

system.out.println("all parser finish");

}}

join用於讓當前執行執行緒等待join執行緒執行結束。其實現原理是不停檢查join執行緒是否存活,如果join執行緒存活則讓當前執行緒永遠等待。

在jdk 1.5之後的並發包中提供的countdownlatch也可以實現join的功能,並且比join的功能更多

public class countdownlatchtest 

}).start();

c.await();

system.out.println("3");

}}

countdownlatch的建構函式接收乙個int型別的引數作為計數器,如果你想等待n個點完成,這裡就傳入n。

當我們呼叫countdownlatch的countdown方法時,n就會減1,countdownlatch的await方法會阻塞當前執行緒,直到n變成零。由於countdown方法可以用在任何地方,所以這裡說的n個點,可以是n個執行緒,也可以是1個執行緒裡的n個執行步驟。用在多個執行緒時,只需要把這個countdownlatch的引用傳遞到執行緒裡即可。

參考: j**a程式設計的邏輯 19.3 倒計時門栓countdownlatch

j**a併發程式設計的藝術 8.1 等待多執行緒完成的countdownlatch

CountDownLatch 計數器門閂

countdownlatch 就是把執行緒關起來,不許出來,得先幹完活。countdownlatch 計數器門閂 countdownlatch 計數器門閂 該任務是如果完成了5個任務,那麼才去執行發工資的事情 author beiyaoyao public class countdownlatchd...

序列計數 count

portal broken qwq 給你乙個長度為 n 的序列,序列中的每個數都是不超過 m 的正整數,求滿足以下兩個條件的序列數量 1.序列中至少有乙個質數 2.序列中 n 個數之和為 p 的倍數 資料範圍 1 n 10 9,1 m 2 10 7,1 p 100 我的媽呀真實智力 為什麼連最基礎的...

count 數字計數方法

給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入檔案中僅包含一行兩個整數a b,含義如上所述。輸出檔案中包含一行10個整數,分別表示0 9在 a,b 現了多少次。1 99 9 20 20 20 20 20 20 20 20 20 30 的資料中,a b ...