래치와 비슷하게 여러 작업을 묶어 대기하고 한꺼번에 통과시킬 수 있는 녀석
래치는 1회성 객체로 한번 관문을 지나면 상태를 되돌릴 수 없지만, 배리어는 반복적으로 사용이 가능하다.
배리어를 처음 만들때 지정했던 배리어 포인트까지 await 카운트가 되면 배리어는 리셋되어 다시 초기 상태로 돌아간다.
public class CycleBarrierTest {
public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
final int loopCount = 3;
final int nThreads = 5;
final CyclicBarrier barrier = new CyclicBarrier(nThreads + 1);
for (int i = 0; i < loopCount; i++) {
for (int k = 0; k < nThreads; k++) {
final int threadIdx = k;
new Thread(() -> {
try {
Thread.sleep(1000);
System.out.println("Thread: " + threadIdx);
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
Thread.currentThread().interrupt();
}
}).start();
}
barrier.await();
System.out.println("Finish!");
}
}
}