java 多線程 CyclicBarrier

CyclicBarrier 循環柵欄 ,主要方法如下:

new CyclicBarrier(num);//設置柵欄數

new CyclicBarrier(num,Runnable)//設置柵欄數(目標數),並且達到目標後做的事情

cyclicBarrier.await();//到達柵欄,讓線程等待,等到有足夠多到達柵欄的任務纔會繼續往下走。柵欄是循環的。

示例:


    public static void test2(){
        /**
         * 設置 10 個目標數,目標完成後需要做的事情,這個會循環去做
         */
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3,()->{
            System.out.println("終於完成任務了");
        });//目標數
        for (int j=0;j<5;j++) {
            new Thread(()->{
                for(int i=0;i<3;i++){
                    try {
                        Thread.sleep(1000);
                        System.out.println("嘗試獲取 :"+i);
                        cyclicBarrier.await();//大家一起達到這個目標,才繼續往下執行
                        System.out.println("獲取成功 :"+i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

運行結果:

嘗試獲取 :0
嘗試獲取 :0
嘗試獲取 :0
嘗試獲取 :0
嘗試獲取 :0
終於完成任務了
獲取成功 :0
獲取成功 :0
獲取成功 :0
嘗試獲取 :1
終於完成任務了
獲取成功 :1

。。。

結果說明:

上訴程序聲明的柵欄數爲3,所以調用 3個 cyclicBarrier.await() 就可以執行

1:cyclicBarrier 聲明時的Runnable線程,也就是打印 “終於完成任務了”

2:cyclicBarrier.await() 阻斷後的程序 也就是 “獲取成功”

所以上訴第6個“嘗試獲取”後,會有連續3個“獲取成功”

 

發佈了42 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章