🧵 ExecutorService란?
ExecutorService는 Java에서 스레드를 직접 생성하고 관리하는 번거로움 없이, 효율적으로 스레드를 실행할 수 있도록 해주는 인터페이스입니다.
- 개발자가 직접
Thread를 만들지 않고도 멀티스레딩 작업을 수행할 수 있습니다.
✅ 특징
- 스레드 풀(Thread Pool) 을 사용하여 스레드를 재사용함
- 스레드 생성, 실행, 종료 생명 주기를 자동으로 관리
- 비동기 작업 처리가 용이함
⚠️ new Thread()와의 차이점
| 구분 | new Thread() | ExecutorService |
|---|
| 생성 | 매번 새 스레드 생성 | 스레드 풀에서 스레드 재사용 |
| 관리 | 직접 해야 함 | 자동 관리 |
| 성능 | 비용 높음 | 효율적 |
🛠️ 주요 메소드
execute(Runnable command) : Runnable 작업 실행 (결과 반환 없음)
submit(Runnable task) : Runnable 작업 실행 후 Future<?> 반환
submit(Callable<T> task) : Callable 작업 실행 후 Future<T> 반환
shutdown() : 더 이상 새로운 작업은 받지 않고, 기존 작업이 끝나면 종료
shutdownNow() : 즉시 작업 종료 시도
💡 Thread Pool이란?
- 미리 정해진 일정 개수의 스레드를 생성해 두고, 필요할 때 스레드를 재사용하는 구조
- 불필요한 스레드 생성 방지로 성능 향상
- DB 커넥션 풀과 비슷한 개념
⚙️ Thread Pool 동작 원리
- 미리 스레드를 일정 개수 생성 (
newFixedThreadPool(5) 등)
- 작업 요청이 들어오면 대기 중인 스레드가 실행
- 작업이 끝난 스레드는 다시 풀로 복귀
- 스레드가 부족하면 큐에 대기
shutdown() 호출 시 새 작업은 거부, 기존 작업만 마무리
✅ Thread Pool 사용하는 이유
- 반복적인 스레드 생성/소멸 비용 감소
- 메모리·CPU 낭비 방지
- 과도한 스레드 사용 방지 → 성능 최적화
❌ Thread Pool 없이 처리 시 문제점
- 요청마다 새로운 스레드 생성 → 과부하, 성능 저하
🔎 ExecutorService의 주요 스레드 풀 종류
1. newFixedThreadPool(int nThreads)
- 고정된 개수의 스레드 유지
- 초과된 작업은 큐에 저장
- 작업량이 일정하고 제한된 스레드로 처리할 때 적합
2. newCachedThreadPool()
- 필요 시 스레드를 동적으로 생성, 유휴 스레드 재사용
- 순간적인 요청 처리에 적합
- 스레드 수 제한 없음 → 과부하 가능성 있음
3. newSingleThreadExecutor()
- 단일 스레드로 작업 순차 실행
- 순서 보장 및 데이터 무결성이 중요한 작업에 적합
4. newScheduledThreadPool(int corePoolSize)
- 주기적인 작업 실행 가능
- 타이머, 스케줄링 작업에 사용