countdownlatch
是乙個同步的輔助類,它可以允許乙個或多個執行緒等待,直到一組在其它執行緒中的操作執行完成。
乙個countdownlatch
會通過乙個給定的count
數來被初始化。其中await()
方法會一直阻塞,直到當前的count
被減到0,而這個過程是通過呼叫countdown()
方法來實現的。在await()
方法不再阻塞以後,所有等待的執行緒都會被釋放,並且任何await()
的子呼叫都會立刻返回。這是一次性的--count
不能被重置。如果你需要一種能重置count
的版本,請考慮使用cyclicbarrier
。
countdownlatch
是乙個多功能的同步工具,可以被用於各種目的。乙個countdownlatch
通過乙個值為1的count
被初始化,來作為乙個開/關的門或門閂:所有呼叫了await()
的執行緒都會在門前等待,直到門被乙個執行緒通過呼叫countdown()
開啟。乙個被初始化為n的countdownlatch
可以被用來「在n個執行緒都完成了某種操作(或者一些操作已經被完成了n次)之後建立乙個執行緒」。
countdownlatch
乙個有用的屬性就是它不需要執行緒們在繼續執行之前,呼叫countdown
來等待count
被減到0。它簡單地阻止了任何呼叫了await()
的執行緒繼續,直到所有的執行緒都能
下面請看乙個應用場景:
有1個driver和5個worker,需要滿足以下兩點要求:
1public
class
driver
1011 system.out.println("
driver is doing something...");
12 system.out.println("
driver is finished, start all workers ...");
13 startsignal.countdown(); //
driver執行完畢,發出開始訊號,使所有的worker執行緒開始執行
14 donesignal.await(); //
等待所有的worker執行緒執行結束
15 system.out.println("
finished.");
16}17}
1819
class
worker implements runnable
26public
void
run() catch
(interruptedexception e) 34}
35}36
執行結果:
1 driver isdoing something...
2 driver is
finished, start all workers ...
3working now ...
4working now ...
5working now ...
6working now ...
7working now ...
8 finished.
示例仍然使用開會案例。老闆進入會議室等待5個人全部到達會議室才會開會。所以這裡有兩個執行緒老闆等待開會執行緒、員工到達會議室:
1public
class
countdownlatchtest catch
(interruptedexception e)
1718 system.out.println("
所有人都已經到齊了,開會吧...");
19}20}
2122
//員工到達會議室
23static
class
empleoyeethread extends thread30}
3132
public
static
void
main(string args)39}
40 }
1private listget(final listparams
) catch
(busines***ception e) finally25}
26});27}
28try
catch
(interruptedexception e)
33return
result;
34 }
多執行緒條件通行工具 CountDownLatch
countdownlatch的作用是,執行緒進入等待後,需要計數器達到0才能通行。例子1 主線程建立了若干子執行緒,主線程需要等待這若干子執行緒結束後才結束。例子2 執行緒有若干任務,分多個執行緒來完成,需要等待這若干任務被完成後,才繼續執行處理。原始碼 since 1.5 author doug ...
java執行緒同步之CountDownLatch
1 類說明 jdk的concurrent包中的countdownlatch類是乙個執行緒同步的輔助類,它使得執行緒可以一直等待在其它執行緒中執行的操作,直到此操作結束。countdownlatch在初始化的時候指定乙個大小值n,呼叫countdownlatch的await方法的執行緒會陷入等待之中,...
多執行緒系列(二) 多執行緒基礎
目錄 一 執行緒的幾種狀態 屬性 方法 執行緒的5個狀態 1 建立狀態 new 對應 thread th new thread worker 時 就建立了乙個新的執行緒,僅僅是新建狀態,程式還沒有執行執行緒中的 2 就緒狀態 runnable 對應 th.start 方法,新建執行緒在接收到star...