指定數量的線程所有調用 cyclicBarrier的await()方法時,這些線程再也不阻塞
java
經過reset()方法能夠進行重置
git
public CyclicBarrier(int parties)
多線程
`public CyclicBarrier(int parties, Runnable barrierAction)
設置屏障打開前首先運行的線程即該線程的執行時機是在到達屏障以後再執行`ide
`一、初始化50000條數據
二、經過5個線程並行處理 每個線程分別處理10000條數據(經過線程池中的5個線程處理)
三、而後將5個線程分別的處理結果彙總(經過初始化柵欄的時候第二個構造函數定義的那個線程處理即Runnable barrierAction)`函數
`isBroken()
默認爲true
狀態被改變的場景:
1.等待線程被interrupt
2.等待線程timeout
三、其餘線程調用reset(),將其重置爲true`源碼分析
barrier.getParties()
spa
barrier.getNumberWaiting()
.net
`形象的理解:每有一個線程達到柵欄,就會向柵欄報道,等到齊了指定人數,柵欄就會打開,讓這些數量的線程經過
該狀態被終止的場景:
1.屏障打開
2.本線程被interrupt
3.其餘等待線程被interrupted
4.其餘等待線程timeout
5.其餘線程調用reset()`線程
`該狀態被終止的場景:
1.屏障打開(返回true)
2.本線程被interrupt
3.本線程timeout
4.其餘等待線程被interrupted
5.其餘等待線程timeout
6.其餘線程調用reset()`code
`reset()
將CyclicBarrier迴歸初始狀態,若是有正在等待的線程,則會拋出BrokenBarrierException異常`
CyclicBarrier
線程相互等待
能夠重置count
CountDownLatch
當前線程等待一個或多個線程
count=0,不可重置
await方法
同時,Generation描述着CyclicBarrier的更新換代。在CyclicBarrier中,同一批線程屬於同一代。當有parties個線程到達barrier以後,generation就會被更新換代。其中broken標識該當前CyclicBarrier是否已經處於中斷狀態。
默認barrier是沒有損壞的。當barrier損壞了或者有一個線程中斷了,則經過breakBarrier()來終止全部的線程
`這裏先簡單介紹下和synchronized區別 下一節再詳細的說下
(1)synchronized是獨佔鎖,加鎖和解鎖的過程自動進行,易於操做,但不夠靈活。ReentrantLock也是獨佔鎖,加鎖和解鎖的過程須要手動進行,不易操做,但很是靈活。
(2)synchronized可重入,由於加鎖和解鎖自動進行,沒必要擔憂最後是否釋放鎖;ReentrantLock也可重入,但加鎖和解鎖須要手動進行,且次數需同樣,不然其餘線程沒法得到鎖。
(3)synchronized不可響應中斷,一個線程獲取不到鎖就一直等着;ReentrantLock能夠相應中斷。
(4)ReentrantLock還能夠實現公平鎖機制 通俗的理解就是誰排隊時間最長誰先執行獲取鎖`
https://gitee.com/pingfanrenbiji/myconcurrent/blob/master/src/main/java/pers/hanchao/concurrent/eg15/CyclicBarrierDemo.java
`https://blog.csdn.net/qq_3829...
https://baijiahao.baidu.com/s...`
本文使用 mdnice 排版