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個“獲取成功”