Executor
🧵 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조합으로 자주 사용한다. - 비동기 처리와 병렬 작업의 기반 개념으로 이해하면 된다.
댓글남기기