래치와 비슷하게 여러 작업을 묶어 대기하고 한꺼번에 통과시킬 수 있는 녀석

래치는 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!");
        }
    }
     
}