티스토리 뷰

Java

ExecutorService와 ForkJoinPool

seungwonlee 2025. 3. 31. 17:57

ExecutorServiceForkJoinPool는 Java에서 멀티 스레드를 관리하는 데 사용되는 두 가지 주요 클래스로 각기 다른 목적과 특성을 가지고 있습니다. 아래에서 두 클래스의 용도를 설명하겠습니다.

ExecutorService

  • 멀티 쓰레드 작업을 관리하고 실행하는 인터페이스
  • Executor를 상속하여 작업을 실행할 책임까지 담당하고 주로 스레드 풀에서 작업을 처리
  • TheadPoolExecutor가 대표적인 구현체로 이 인터페이스는 여러 가지 기능을 통해 멀티스레드 작업을 효율적으로 처리
  • 작업 후 shutdown 호출되기 전까지 계속해서 다음 작업을 대기하기 때문에 반드시 shutdown을 호출

비동기 작업 기능

  • submit: Runnable이나 Callable 작업을 제출하고 작업이 완료된 후 Future 객체를 반환
  • invokeAll: 여러 작업을 동시 실행하고 모든 작업이 종료되면 List<Future>를 반환
  • invokeAny: 여러 작업중 가장 먼저 완료된 하나의 작업 결과만을 반환

ForkJoinPool

  • ExecutorService의 구현체 중 하나
  • 분할된 작업을 처리하고 결과를 합치는 방식으로 동작하는 분할 정복(Divide and Conquer) 알고리즘에 최적화
  • work-stealing 방식을 사용하여 스레드가 유휴 상태인 경우 다른 스레드의 작업을 훔쳐서 처리
  • 작업 분할 및 작업 스틸링에는 일정한 오버헤드가 있어 단순한 threadPoolExecutor를 사용하면 더 빠름

work-stealing

  • 스레드가 할 일이 없으면 다른 스레드의 작업을 가져와 처리 스레드 간의 작업 부하를 균형 잡히게 유지
  • 내부적으로 ForkJoinPool을 사용하여 보통은 default로 commonPool을 이용
  • thread의 개수를 정해주고 싶은 경우 아래와 같이 사용
  • 사용 완료 후 shutdown 호출해야 메모리 누수 방지 가능
ForkJoinPool forkJoinPool = new ForkJoinPool(6);
forkJoinPool.submit(() -> {   
    list.parallelStream().forEach((data -> { ...});
}).get();
forkJoinPool.shutdown();

정리

  • ExecutorService는 각각의 스레드가 맞은 일을 처리하고 더 작은 단위로 나누지 않고 처리한다.
  • ForkJoinPool은 작업을 많이 나눠서 처리할 수 있고 다른 스레드의 작업을 가져와 처리할 수 있다.

단순히 작업을 동시에 처리 하는 경우에는 ExecutorService를, 복잡하고 분할해서 처리 해야 하는 경우에는 ForkJoinPool을 사용하는 것이 적합합니다.


참고자료

 

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함