🧵 Executor

정의

Executor작업을 별도의 스레드에서 실행하도록 위임하는 자바의 실행 추상화 인터페이스이다. 직접 스레드를 생성하지 않고 작업 실행 방식을 분리할 수 있게 해준다.

비동기 처리나 병렬 작업을 더 안전하고 재사용 가능하게 구성할 때 사용한다.

🧩 역할

  • 작업 실행을 위임한다
  • 스레드 생성과 실행 방식을 분리한다
  • 비동기 처리 기반을 제공한다
  • 스레드 풀을 활용한 재사용을 가능하게 한다

🛠 구성 요소

요소 설명
Executor 작업 실행을 추상화한 인터페이스다
ExecutorService 작업 제출과 종료 제어를 제공하는 확장 인터페이스다
ThreadPoolExecutor 스레드 풀 기반 실행 구현체다
ThreadPoolTaskExecutor Spring에서 자주 쓰는 Executor 구현체다

🛠 사용 예시

Java 표준 실행

Executor executor = Executors.newFixedThreadPool(10);
executor.execute(() -> System.out.println("task"));

Spring ThreadPoolTaskExecutor

@Bean
public ThreadPoolTaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(20);
    executor.setQueueCapacity(100);
    executor.setThreadNamePrefix("EXEC-");
    executor.initialize();
    return executor;
}

CompletableFuture와 함께 사용

CompletableFuture<String> future =
        CompletableFuture.supplyAsync(() -> "result", taskExecutor);

🧩 주요 설정 값

설정값 설명
corePoolSize 기본 유지 스레드 수
maxPoolSize 최대 스레드 수
queueCapacity 대기 작업 큐 크기
keepAliveSeconds 유휴 스레드 유지 시간

🧩 활용 예시

  • 비동기 처리
  • 병렬 API 호출
  • IO 작업 병목 해소
  • 대량 요청 처리

🧩 특징

  • 직접 Thread를 만드는 것보다 관리가 쉽다
  • 작업 재사용과 자원 관리가 편하다
  • Spring의 @Async와 함께 자주 사용된다
  • 작업 성격에 따라 별도 Executor 분리가 가능하다

⚠️ 주의사항

  • 작업 성격에 따라 IO용, CPU용 Executor를 분리하는 것이 좋다.
  • 큐 크기와 스레드 수를 너무 크게 잡으면 메모리와 컨텍스트 스위칭 비용이 커질 수 있다.
  • 비동기 작업의 예외 처리를 따로 고려해야 한다.
  • CompletableFuture와 함께 사용할 때 결과 취합 흐름을 명확히 해야 한다.

📌 정리

  • Executor는 작업 실행을 위임하는 자바의 실행 추상화다.
  • Spring에서는 ThreadPoolTaskExecutor@Async 조합으로 자주 사용한다.
  • 비동기 처리와 병렬 작업의 기반 개념으로 이해하면 된다.

연결문서

댓글남기기