允許一組線程全部等待彼此達到共同屏障點。 循環阻塞在涉及固定大小的線程的程序中很有用,這些線程必須偶爾等待彼此。 屏障被稱爲循環 ,因爲它可以在等待的線程被釋放之後重新使用。這和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個構造方法,如果不需要執行匿名線程,可以只傳入每一次等待的次數