2 2 CyclicBarrier的理解和使用

2021-10-07 03:05:42 字數 3082 閱讀 2045

快速理解:給所有執行緒加上了乙個屏障,只有所有的執行緒都到達屏障之後(即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 使用詳解

從字面上的意思可以知道,這個類的中文意思是 迴圈柵欄 大概的意思就是乙個可迴圈利用的屏障。它的作用就是會讓所有執行緒都等待完成後才會繼續下一步行動。舉個例子,就像生活中我們會約朋友們到某個餐廳一起吃飯,有些朋友可能會早到,有些朋友可能會晚到,但是這個餐廳規定必須等到所有人到齊之後才會讓我們進去。這裡...