아래와 같은 코드가 있고, doWork()이 완료되기까지 비교적 오랜 시간이 소요된다면.
public void batchWork(Collection<Work> works) { for (Work work : works) { work.doWork(); } }
위의 코드는 아래와 같은 형식으로 개선이 가능하다.
execute() 내부 동작이 병렬로 실행되므로 work 개체는 쓰레드 안정성을 확보하고 있어야 한다.
public void batchWork(Collection<Work> works) { ExecutorService executor = Executor.newFixedThreadPool(4); CountDownLatch latch = new CountDownLatch(collection.size()); for (Work work : works) { executor.execute(() -> { work.doWork(); latch.countDown(); }) } latch.await(); }
CountDownLatch가 전체 작업의 시작과 끝의 타이밍 제어를 해주고 있다.
참고: https://www.baeldung.com/java-countdown-latch
댓글 없음:
댓글 쓰기