循环栅栏,什么时候人满了就把栅栏推到,都放出去,出去之后栅栏又重新起来,再等人满了,再放开。
比如有一个复杂的操作,需要访问数据库,需要访问网络,需要访问文件,有一种方式是可以顺序执行,但这样效率太低了,另外可以并发执行,一个线程去访问数据库,一个线程访问网络,一个线程访问文件,等三个线程都执行完之后再做后续操作。这个时候就可以用CyclicBarrier。
public class Study07 {
public static void main(String[] args) {
CyclicBarrier barrier =new CyclicBarrier(3, () -> {
System.out.println("执行后续操作");
});
new Thread(()->{
System.out.println("访问数据库...");
try {
barrier.await();
}catch (InterruptedException e) {
e.printStackTrace();
}catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
System.out.println("访问网络...");
try {
barrier.await();
}catch (InterruptedException e) {
e.printStackTrace();
}catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
System.out.println("访问文件...");
try {
barrier.await();
}catch (InterruptedException e) {
e.printStackTrace();
}catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
执行结果:
访问数据库...
访问网络...
访问文件...
执行后续操作