반응형
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
를 내부 구조까지 깊게 설명하게 됩니다.
반응형
'language > java' 카테고리의 다른 글
| CompletableFuture 완벽 이해하기 (0) | 2026.06.01 |
|---|---|
| ThreadPool 구조 완벽 이해하기 (0) | 2026.06.01 |
| Thread-safe 컬렉션 완벽 이해하기 (0) | 2026.05.29 |
| Atomic 클래스 (AtomicInteger, AtomicLong 등) 완벽 이해하기 (0) | 2026.05.29 |
| CAS(Compare And Swap) 완벽 이해하기 (0) | 2026.05.29 |
댓글