쓰레드를 N개 실행했을 때, 일정 개수의 쓰레드가 모두 끝날 때까지 기다려야만 진행할 수 있거나 다른 쓰레드를 실행시킬 수 있는 경우 사용한다. 예를 들어 리스트에 어떤 자료구조가 있고, 각 자료구조를 병렬로 처리한 후 배치(batch)로 데이터베이스를 업데이트 한다거나 다른 시스템으로 push 하는 경우가 있다.
CountDownLatch는 다음과 같이 생성할 수 있다. 인자로 Latch의 숫자를 전달한다.
CountDownLatch countDownLatch = new CountDownLatch(5);
다음과 같이 countDown()을 호출하면 Latch의 숫자가 1개씩 감소한다.
countDownLatch.countDown();
await()는 Latch의 숫자가 0이 될 때까지 기다리는 코드이다.
countDownLatch.await();
다른 쓰레드에서 countDown()을 5번 호출하게 된다면 Latch는 0이 되며, await()는 더 이상 기다리지 않고 다음 코드를 실행하게 된다.
즉, CountDownLatch는 메인 쓰레드에서 작업을 처리하는 쓰레드를 만들고 실행한다. 그리고 개별 쓰레드가 CountLatch의 값을 하나씩 제거하면, 메인 쓰레드가 시그널을 받아서 흐름을 진행하는 형태이다.
참고