Cyclic是周期的意思,Barrier是關卡的意思。CyclicBarrier不僅有CountDownLatch的功能,還可以實現屏障等待,即階段性同步。因此適用于,需要循環地實現線程一起做任務的目標。
CyclicBarrier允許一組線程相互等待,直到到達某個公共屏障點,如果某些進程需要實時地相互等待,就可以使用CyclicBarrier。CyclicBarrier的重點在于,任何一個線程沒有完成任務,其他所有的線程都必須等待,即,同類相互等待。
CyclicBarrier的計數是加法操作。
new CyclicBarrier(5, new
Runnable(){})設置最大為5個同行者,當線程個數等于同行者數目時,即只有5個線程,則5個線程都執行了cbRef的await()方法后,才會走到run()方法內,然后每個方法再各自繼續執行。否則這些線程彼此相互等待,一直阻塞。
當線程個數大于partier(同行者)數量時,湊齊同行者數量個線程的await后,就會走到run方法內,湊齊的方法也會各自繼續執行。之后再次湊齊,會再執行一遍run方法,各自繼續執行。從而實現分批進行。當循環執行時,到達屏障點一同執行的線程組合是可能是隨機的。
CyclicBarrier具有屏障重置性。?當湊齊同行者數目后,使用getNumberWaiting()方法可以看到,等待數量變為0.再來一個同行者,等待數目就會變成n-1。
isBroken()方法查詢此屏障是否處于損壞狀態。?如果其中一個進程因為出現異常而中斷,不會影響其他進程的執行和等待,但是,如果用Thread的interrupt()方法進行中斷,則所有的線程都會拋出BrokenBarrierException異常。也就是說,CyclicBarrier類對現成的中斷處理,會使用全有、或者全無的破壞模型。即,有一個線程因為超時或中斷提前離開了屏障點,其他所有在屏障點等待的線程也會拋出異常并離開屏障點。
?await(long timeout,
TimeUnit unit)如果在指定時間內達到parties的數量則繼續運行,否則拋出超時異常。
getParties()屏障對象的parties個數。
??getNumberWaiting()在屏障處等待的線程個數。
reset()重置屏障。屏障被重置后,如果有線程在等待parties,會出現Broken異常。?
示例代碼https://github.com/whitefancy/OJproblems/tree/master/javaconcurrent/cyclicbarrier
參考文檔
《Java并發編程
核心方法與框架》(高洪巖)??
??