Executors — Executor 프레임워크 팩토리·유틸리티

Executors — Executor 프레임워크 팩토리·유틸리티

Executors는 이 패키지에 정의된 Executor, ExecutorService, ScheduledExecutorService, ThreadFactory, Callable 클래스를 위한 팩토리·유틸리티 메서드를 제공해요. 스레드 풀을 직접 구성하지 않고 편리하게 만들어 쓰는 가장 흔한 진입점이에요.

출처: Java API Reference

본문

개념 이해하기

Executors는 이 패키지의 executor 클래스를 위한 팩토리·유틸리티 메서드를 제공해요. 다음 종류의 메서드를 지원해요:

  • 흔히 유용한 설정으로 구성된 ExecutorService를 만들고 반환하는 메서드
  • ScheduledExecutorService를 만들고 반환하는 메서드
  • 구현별 메서드를 접근 불가능하게 만들어 재구성을 비활성화한 "래핑된(wrapped)" ExecutorService를 만드는 메서드
  • 새 스레드를 알려진 상태로 설정하는 ThreadFactory를 만드는 메서드
  • 다른 closure 유사 형태에서 Callable을 만드는 메서드
public class Executors
extends Object

고정 스레드 풀

public static ExecutorService newFixedThreadPool(int nThreads) — 공유 무경계 큐에서 동작하는 고정 수의 스레드를 재사용하는 스레드 풀을 만들어요. 어느 시점에 최대 nThreads개의 스레드가 태스크를 처리해요. 모든 스레드가 활성일 때 추가 태스크는 스레드가 생길 때까지 큐에서 대기해요. 실행 중 실패로 종료된 스레드는 필요 시 새 스레드로 대체되고, 명시적 shutdown 전까지 풀의 스레드는 존재해요.

  • IllegalArgumentExceptionnThreads <= 0

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) — 제공된 ThreadFactory로 새 스레드를 만드는 동일한 고정 풀.

  • NullPointerException, IllegalArgumentException

작업 훔치기 풀

public static ExecutorService newWorkStealingPool(int parallelism) — 주어진 병렬 수준을 지원할 만큼의 스레드를 유지하고, 경합을 줄이기 위해 여러 큐를 사용할 수 있는 풀을 만들어요. 실제 스레드 수는 동적으로 늘었다 줄었다 해요. work-stealing 풀은 제출된 태스크의 실행 순서를 보장하지 않아요. (JDK 1.8+)

  • IllegalArgumentExceptionparallelism <= 0

public static ExecutorService newWorkStealingPool()이용 가능한 프로세서 수를 목표 병렬 수준으로 하는 work-stealing 풀을 만들어요. (JDK 1.8+)

단일 스레드 풀

public static ExecutorService newSingleThreadExecutor() — 무경계 큐에서 동작하는 단일 워커 스레드를 사용하는 Executor를 만들어요. 태스크는 순차 실행이 보장되고, 어느 시점에 한 번에 하나의 태스크만 활성화돼요. 실행 중 종료된 스레드는 필요 시 대체돼요. 동등한 newFixedThreadPool(1)과 달리 추가 스레드를 사용하도록 재구성될 수 없음이 보장돼요.

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) — 제공된 팩토리를 쓰는 단일 스레드 executor.

  • NullPointerException

캐시 스레드 풀

public static ExecutorService newCachedThreadPool() — 필요할 때 새 스레드를 만들지만 이용 가능하면 이전에 만든 스레드를 재사용하는 풀을 만들어요. 많은 단기 비동기 태스크를 실행하는 프로그램의 성능을 개선해요. 60초 동안 사용되지 않은 스레드는 종료·제거되므로 오랫동안 유휴인 풀은 자원을 소비하지 않아요.

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) — 제공된 팩토리를 쓰는 캐시 풀.

  • NullPointerException

태스크당 스레드 executor (JDK 21+)

public static ExecutorService newThreadPerTaskExecutor(ThreadFactory threadFactory) — 각 태스크마다 새 Thread를 시작하는 Executor를 만들어요. Executor가 만드는 스레드 수는 무경계예요. 제출된 태스크의 대기 결과를 나타내는 Futurecancel(true)를 호출하면 태스크를 실행하는 스레드를 interrupt해요. (JDK 21+)

  • NullPointerException

public static ExecutorService newVirtualThreadPerTaskExecutor() — 각 태스크마다 새 가상 스레드(virtual Thread) 를 시작하는 Executor를 만들어요. newThreadPerTaskExecutor(ThreadFactory)와 동등하되 가상 스레드를 만드는 팩토리를 사용해요. (JDK 21+)

예약 스레드 풀

public static ScheduledExecutorService newSingleThreadScheduledExecutor() — 주어진 지연 후 실행하거나 주기적으로 실행하도록 커맨드를 스케줄할 수 있는 단일 스레드 executor를 만들어요. 순차 실행 보장, newScheduledThreadPool(1)과 달리 재구성 불가.

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) — 지연 후 실행 또는 주기 실행을 스케줄할 수 있는 스레드 풀을 만들어요.

  • corePoolSize — 유휴여도 풀에 유지할 스레드 수
  • IllegalArgumentExceptioncorePoolSize < 0

public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) / newScheduledThreadPool(int, ThreadFactory) — 팩토리 변형.

래핑(unconfigurable)

public static ExecutorService unconfigurableExecutorService(ExecutorService executor) — 정의된 모든 ExecutorService 메서드를 주어진 executor에 위임하되, 캐스트로 접근 가능한 다른 메서드는 위임하지 않는 객체를 반환해요. 주어진 구체 구현의 구성을 안전하게 "고정" 해 조정을 금지하는 방법을 제공해요.

  • NullPointerException

public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor) — 예약 래핑 변형.

  • NullPointerException

ThreadFactory

public static ThreadFactory defaultThreadFactory() — 새 스레드를 만드는 기본 팩토리를 반환해요. 모든 스레드가 같은 ThreadGroup에 만들어지고, non-daemon이며 우선순위 Thread.NORM_PRIORITY와 그룹 최대 우선순위 중 작은 값으로 설정돼요. 이름은 pool-N-thread-M 형식이에요.

public static ThreadFactory privilegedThreadFactory() — 현재 스레드와 같은 권한을 가진 새 스레드를 만드는 팩토리를 반환해요. 보안 관리자(Security Manager) 폐기로 함께 폐기 예정(deprecated for removal). (JDK 17+)

Callable 변환

public static <T> Callable<T> callable(Runnable task, T result) — 호출 시 주어진 task를 실행하고 주어진 result를 반환하는 Callable을 반환해요. 결과 없는 액션에 Callable을 요구하는 메서드를 적용할 때 유용.

  • NullPointerException

public static Callable<Object> callable(Runnable task) — 호출 시 task를 실행하고 null을 반환하는 Callable. NullPointerException.

public static Callable<Object> callable(PrivilegedAction<?> action) / callable(PrivilegedExceptionAction<?> action) — privileged 액션을 실행하고 결과를 반환하는 Callable. NullPointerException.

public static <T> Callable<T> privilegedCallable(Callable<T> callable) — 현재 접근 통제 컨텍스트에서 callable을 실행하는 Callable. 보안 관리자 폐기와 함께 폐기 예정. NullPointerException.

public static <T> Callable<T> privilegedCallableUsingCurrentClassLoader(Callable<T> callable) — 현재 컨텍스트 클래스 로더로 실행하는 변형. 폐기 예정. NullPointerException, AccessControlException.

더 알아보기 (Learn more)