????????CyclicBarrier是一個同步工具類我抠,它允許一組線程在到達某個柵欄點(common barrier point)互相等待苇本,發(fā)生阻塞,直到最后一個線程到達柵欄點菜拓,柵欄才會打開瓣窄,處于阻塞狀態(tài)的線程恢復繼續(xù)執(zhí)行。該柵欄還可以復用纳鼎。
構造函數:
? ??public CyclicBarrier(int parties) {
????????this(parties,null);
????}
? ??public CyclicBarrier(int parties, Runnable barrierAction) {
????????if (parties <=0)throw new IllegalArgumentException();
????????this.parties = parties;
????????this.count = parties;
????????this.barrierCommand = barrierAction;
????}
? ??parties:指定相互等待的線程的數量
? ??barrierAction:當所有線程到達柵欄后優(yōu)先執(zhí)行的函數俺夕。是新啟的一個線程
if (index ==0) {// tripped
? ? boolean ranAction =false;
try {
????????final Runnable command =barrierCommand;
????????if (command !=null)
????????????????command.run();//是新啟的一個線程? ,執(zhí)行任務
????????ranAction =true;
????????nextGeneration();
????????return 0;
}finally {
if (!ranAction)
breakBarrier();
}
}
await():柵欄,等待
await(long timeout, TimeUnit unit)
? ? 1贱鄙、保證線程安全(保證線程)劝贸。
? ? 2、獲取到鎖的線程逗宁,count-1,并且進入等待(condition.await() or condition.await(timeout))映九。
? ? 3、當count等于0的時候瞎颗,會喚醒所有等待的線程件甥。其中 nextGeneration方法可以實現屏障的循環(huán)使用:重新生成Generation對象,恢復count值
? ? 4哼拔、等待時間的參數用作condition 的await參數引有。