본문 바로가기
language/java

ExecutorService 완벽 이해하기

by 죄니안죄니 2026. 6. 1.
반응형

ExecutorService 완벽 이해하기

지금까지 배운 방식으로 스레드를 생성하면:

 
Thread t = new Thread(() -> {
    System.out.println("작업");
});

t.start();
 

문제 없어 보입니다.

그런데 서버 개발에서는 심각한 문제가 있습니다.

예를 들어:

사용자 1만 명 접속
 

했다고 가정해보자.


1. Thread를 직접 생성하면?

 
for(int i=0; i<10000; i++) {

    new Thread(() -> {
        doWork();
    }).start();
}
 

2. 무슨 일이 발생할까?

스레드 1만 개 생성.


운영체제는

Stack 생성
TCB 생성
스케줄링 등록
Context Switch 관리
 

해야 한다.


3. 결과

CPU 폭주
메모리 부족
성능 급락
 

4. 그래서 등장

Java 5부터:

ExecutorService

제공.


5. ExecutorService란?

한 줄 정의.

Thread 생성과 관리를 대신 해주는 Thread Pool 관리자
 

6. 핵심 아이디어

기존 방식.

작업 1
 ↓
Thread 생성

작업 2
 ↓
Thread 생성

작업 3
 ↓
Thread 생성
 

ExecutorService.

Thread Pool 생성
 ↓
작업만 전달
 ↓
기존 Thread 재사용
 

7. 비유

Thread 직접 생성.

직원 필요
 ↓
매번 채용
 ↓
매번 해고
 

ExecutorService.

직원 10명 미리 채용
 ↓
일만 배정
 

훨씬 효율적.


8. 가장 기본 사용법

 
ExecutorService executor =
    Executors.newFixedThreadPool(5);
 

의미.

Thread 5개 생성
 

9. 작업 제출

 
executor.submit(() -> {

    System.out.println(
        Thread.currentThread().getName()
    );

});
 

10. 실행 흐름

Task 제출
 ↓
Queue 저장
 ↓
유휴 Thread 획득
 ↓
Task 실행
 

11. Thread Pool 구조

ExecutorService

 ├─ Thread1
 ├─ Thread2
 ├─ Thread3
 ├─ Thread4
 └─ Thread5

        ↑

      Queue
 

12. submit() vs execute()

면접 단골.


execute()

 
executor.execute(() -> {

});
 

반환값 없음.

 
void
 

13. submit()

 
Future<?> future =
    executor.submit(() -> {

    });
 

반환값 있음.

 
Future
 

14. 차이

메서드반환값
execute() 없음
submit() Future

15. Future란?

나중에 받을 결과.


비유.

음식 주문
 ↓
주문번호 받음
 ↓
나중에 수령
 

16. 예제

 
Future<String> future =
    executor.submit(() -> {

        return "완료";
    });
 

17. 결과 받기

 
String result =
        future.get();
 

결과.

완료
 

18. 문제

get()은 기다림.


 
future.get();
 

작업 끝날 때까지 Block
 

19. 그래서 등장

나중에 배울:

CompletableFuture
 

20. Thread Pool 종류

매우 중요.


21. FixedThreadPool

가장 많이 사용.

 
Executors.newFixedThreadPool(10);
 

의미.

Thread 10개 고정
 

22. 장점

예측 가능.


23. CachedThreadPool

 
Executors.newCachedThreadPool();
 

필요하면 계속 생성.


24. 문제

트래픽 폭증 시.

Thread 폭증
 

가능.


실무에서는 조심.


25. SingleThreadExecutor

 
Executors.newSingleThreadExecutor();
 

Thread 1개.


항상 순차 실행.


26. ScheduledExecutorService

예약 실행.


 
ScheduledExecutorService scheduler =
    Executors.newScheduledThreadPool(1);
 

27. 예제

 
scheduler.schedule(
    () -> System.out.println("실행"),
    5,
    TimeUnit.SECONDS
);
 

5초 후 실행.


28. 주기 실행

 
scheduleAtFixedRate(...)
 

예:

1분마다 실행
 

배치 작업에서 사용.


29. 실무에서 Executors 사용 주의

매우 중요.


많은 개발자가:

 
Executors.newFixedThreadPool(...)
 

사용.


하지만 실무에서는 권장되지 않음.


30. 이유

내부 Queue.

무제한 Queue
 

사용.


31. 위험

트래픽 폭증.

작업 계속 적재.

메모리 증가
 

OOM
 

가능.


32. 실무 방식

직접 생성.

 
ExecutorService executor =
    new ThreadPoolExecutor(
        10,
        20,
        60,
        TimeUnit.SECONDS,
        new LinkedBlockingQueue<>(1000)
    );
 

33. 의미

Core Thread
=
10

Max Thread
=
20

Queue
=
1000
 

제한 가능.


34. shutdown()

매우 중요.


작업 끝났으면.

 
executor.shutdown();
 

반드시 호출.


35. 왜?

Thread Pool은.

백그라운드 Thread
 

계속 살아있음.


36. shutdownNow()

 
executor.shutdownNow();
 

강제 종료 시도.


실무에서는 조심.


37. Spring에서는?

실제로는.

 
ExecutorService
 

직접 생성보다.


 
@Async
 

사용.


내부적으로.

ThreadPoolTaskExecutor
 

사용.


38. ExecutorService 등장 이유

정리.


기존.

new Thread()
 

비효율.


개선.

Thread Pool
 

Thread 재사용.


39. 면접 단골 질문

Q. ExecutorService란?

Thread Pool 관리 인터페이스
 

Q. submit과 execute 차이?

submit
=
Future 반환

execute
=
반환 없음
 

Q. Future.get() 특징?

Blocking
 

Q. 왜 new Thread를 잘 안 쓰나요?

생성 비용 큼
재사용 불가
관리 어려움
 

Q. Executors 사용 시 주의점?

무제한 Queue
OOM 위험
 

40. ExecutorService와 지금까지 배운 내용 연결

Thread
 ↓
Runnable
 ↓
synchronized
 ↓
volatile
 ↓
CAS
 ↓
Atomic
 ↓
Thread-safe Collection
 ↓
ExecutorService
 

41. 핵심 흐름 요약

Task 제출
 ↓
Queue 저장
 ↓
Thread Pool Thread 획득
 ↓
실행
 ↓
Thread 반환
 ↓
재사용
 

42. 가장 중요한 핵심 한 줄

ExecutorService는 Thread를 직접 생성하지 않고 Thread Pool을 통해 작업(Task)을 효율적으로 실행·관리하기 위한 Java 동시성 프레임워크의 핵심 인터페이스이다.
 

43. 다음 글 예고

다음 글은:

ThreadPool 구조

입니다.

여기서:

Core Pool Size
Maximum Pool Size
Queue
Reject Policy
 

가 어떻게 동작하는지,

실무에서 가장 많이 사용하는:

 
ThreadPoolExecutor
 

를 내부 구조까지 깊게 설명하게 됩니다.

반응형

댓글