这个同步工具CyclicBarrier直译为循环栅栏。立一个栅栏挡在前面,后面人满后把栅栏打开放行,再关闭栅栏,如此循环。
CyclicBarrier构造方法第一个参数为:在栅栏前等待的线程数;第二个参数为:Runnable对象,是栅栏被打开时所做的操作,这个参数也可不传默认不做任何操作。
public class T03_CyclicBarrier {
public static void main(String[] args) {
/*CyclicBarrier barrier = new CyclicBarrier(20, new Runnable() {
@Override
public void run() {
System.out.println("满人,栅栏打开");
}
});*/
CyclicBarrier barrier = new CyclicBarrier(20, () -> {
System.out.println("满人,栅栏打开");
});
for (int i = 0; i < 100; i++) {
new Thread(() -> {
try {
barrier.await(); // 阻塞,直到栅栏打开
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
CyclicBarrier的使用场景
比如需要进行一个复杂的操作 1访问数据库,2访问网络,3访问硬盘文件。
这可以采用顺序执行方式,按顺序依次执行,效率很低。
还有种就是并发执行,让不同的线程执行不同的操作,并且这三个线程都到位了才能去执行,这时就可以用CyclicBarrier。
网友评论