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个“获取成功”