countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作。
相當於是乙個門栓,一開始是關閉的,所有希望通過該門的執行緒都需要等待,等待計數器變為0後,門栓開啟,等待的所有執行緒都可以通過,它是一次性的,開啟後就不能再關上了。
countdownlatch裡有乙個計數,這個計數通過構造方法進行傳遞:
public countdownlatch(int count)
多個執行緒可以基於這個計數進行協作,它的主要方法有:
public void await() throws interruptedexceptionpublic 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 ...