快速理解:給所有執行緒加上了乙個屏障,只有所有的執行緒都到達屏障之後(即cyclicbarrier初始值count=0),所有執行緒才會繼續執行
cyclicbarrier的簡單使用:初始cyclicbarrier是3,當三個執行緒都到達 屏障(即執行await())之後,三個執行緒才能夠自動執行
常用方法:下面都有使用示例
1、static cyclicbarrier cyclicbarrier = new cyclicbarrier(3);
2、static cyclicbarrier cyclicbarrier = new cyclicbarrier(3, new countsum());
3、cyclicbarrier.await();
public class mycyclicbarrier catch (interruptedexception e) catch (brokenbarrierexception e)
}).start();
new thread(()-> catch (interruptedexception e) catch (brokenbarrierexception e)
}).start();
new thread(()-> catch (interruptedexception e) catch (brokenbarrierexception e)
}).start();}}
thread-0開始執行
thread-0到達屏障
thread-1開始執行
thread-1到達屏障
thread-2開始執行
thread-2到達屏障
thread-0所有執行緒到達屏障,thread-0開始執行
thread-2所有執行緒到達屏障,thread-2開始執行
thread-1所有執行緒到達屏障,thread-1開始執行
public class mycyclicbarrier catch (interruptedexception e) catch (brokenbarrierexception e)
}).start();
new thread(()-> catch (interruptedexception e) catch (brokenbarrierexception e)
}).start();
new thread(()-> catch (interruptedexception e) catch (brokenbarrierexception e)
}).start();}}
thread-0開始執行第乙個任務
thread-0到達屏障
thread-1開始執行第乙個任務
thread-1到達屏障
thread-2開始執行第乙個任務
thread-2到達屏障
thread-0所有執行緒到達第一道屏障,thread-0開始執行
thread-0開始執行第二個任務
thread-1所有執行緒到達第一道屏障,thread-1開始執行
thread-1開始執行第二個任務
thread-2所有執行緒到達第一道屏障,thread-2開始執行
thread-2開始執行第二個任務
thread-2所有執行緒到達第二道屏障,thread-2開始執行
**示例:
public class mycyclicbarriercount
@override
public void run()
hashmap.put(thread.currentthread().getid(), sum);
system.out.println(thread.currentthread().getname()+"計算完成了從"+start+"到"+end+"之和:"+sum);
try catch (interruptedexception e) catch (brokenbarrierexception e)
system.out.println(thread.currentthread().getname()+"執行緒到達屏障,繼續執行,但是會在countsum()執行完成之後才開始執行");}}
static class countsum extends thread catch (interruptedexception e)
int sum = 0;
set> entries = hashmap.entryset();
for (map.entryentry : entries)
system.out.println("從1加到100的總數是:" + sum);}}
public static void main(string args)
}
結果:計算結果之後,立馬會執行static cyclicbarrier cyclicbarrier = new cyclicbarrier(3, new countsum());中的countsum()執行緒
完全執行完成之後,其他到達屏障的執行緒才會繼續執行
thread-1計算完成了從1到20之和:210
thread-3計算完成了從61到100之和:3220
thread-2計算完成了從21到60之和:1620
thread-2countsum()執行完成之後,其他到達屏障的執行緒才會繼續執行
從1加到100的總數是:5050
thread-2執行緒到達屏障,繼續執行,但是會在countsum()執行完成之後才開始執行
thread-1執行緒到達屏障,繼續執行,但是會在countsum()執行完成之後才開始執行
thread-3執行緒到達屏障,繼續執行,但是會在countsum()執行完成之後才開始執行
CyclicBarrier實現原理
cyclicbarrier是乙個同步輔助類,它允許一組執行緒互相等待,直到所有執行緒都到達某個公共屏障點 也可以叫同步點 即相互等待的執行緒都完成呼叫await方法,所有被屏障攔截的執行緒才會繼續執行await方法後面的程式。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時cy...
同步屏障CyclicBarrier
cyclicbarrier操作excel public class bankwaterservice implements runnable private void count throws exception 計算當前sheet的銀流資料,計算 省略 sheetbankwatercount.pu...
CyclicBarrier 使用詳解
從字面上的意思可以知道,這個類的中文意思是 迴圈柵欄 大概的意思就是乙個可迴圈利用的屏障。它的作用就是會讓所有執行緒都等待完成後才會繼續下一步行動。舉個例子,就像生活中我們會約朋友們到某個餐廳一起吃飯,有些朋友可能會早到,有些朋友可能會晚到,但是這個餐廳規定必須等到所有人到齊之後才會讓我們進去。這裡...