동기화
를 위해 사용되는 도구입니다. 다른 스레드들이(주로 메인스레드가) 하나 이상의 스레드가 특정 작업을 마치기를 기다리는 상황에서 유용하게 사용됩니다.CountDownLatch countDownLatch = new CountDownLatch(5);
주 스레드나 특정 스레드가 작업을 시작합니다.
작업이 완료되면 해당 스레드는 CountDownLatch의 countDown() 메서드를 호출하여 카운트 값을 감소시킵니다.
countDownLatch.countDown();
countDownLatch.await();
public class CountDownLatchExample {
public static void main(String args[]) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
List<Thread> workers = Stream
.generate(() -> new Thread(new Worker(countDownLatch)))
.limit(5)
.collect(toList());
--------------------------------------------------------
ExecutorService는 스레드를 자동으로 관리해주기 때문에
new Thread 같은 별도로 스레드를 생성하고 시작하는 과정을 직접 구현하지 않아도 됩니다.
for (int i = 0; i < numThreads; i++) {
executorService.submit(new Worker(countDownLatch));
}
--------------------------------------------------------
System.out.println("Start multi threads (tid: "
+ Thread.currentThread().getId() + ")");
workers.forEach(Thread::start);
System.out.println("Waiting for some work to be finished (tid: "
+ Thread.currentThread().getId() + ")");
countDownLatch.await(); // 메인스레드는 Latch가 0이 될때 까지 대기
System.out.println("Finished (tid: "
+ Thread.currentThread().getId() + ")");
}
public static class Worker implements Runnable {
private CountDownLatch countDownLatch;
public Worker(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
System.out.println("Do something (tid: " + Thread.currentThread().getId() + ")");
countDownLatch.countDown();
}
}
}