允许一组线程全部等待彼此达到共同屏障点。 循环阻塞在涉及固定大小的线程的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。这和CountDownLatch有明显的区别。通俗点讲就是:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。
/**
* 描述: 演示CyclicBarrier,过桥,每一次过五个
*/
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
int i;
@Override
public void run() {
i++;
System.out.println("旅游过桥!第"+i+"批次先行");
}
});
// CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for (int i = 0; i < 100; i++) {
new Thread(new Task(i, cyclicBarrier)).start();
}
}
static class Task implements Runnable {
private int id;
private CyclicBarrier cyclicBarrier;
public Task(int id, CyclicBarrier cyclicBarrier) {
this.id = id;
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("线程" + id + "现在前往集合地点");
try {
Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + id + "到了集合地点,开始等待其他人到达");
cyclicBarrier.await();
System.out.println("线程" + id + "出发了");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
共100个线程,每五个线程为一批次执行,在执行前会先执行构造方法的匿名线程
此类本身有2个构造方法,如果不需要执行匿名线程,可以只传入每一次等待的次数