에코노 새싹 스터디에서 동시성에 대해서 공부하고 있고
이를 위해 정리한 자료이다.
ThreadPoolExecutor
- Java에서 제공하는 스레드 풀 구현체
- 여러 개의 스레드를 생성하고 관리
ThreadPoolExecutor의 주요 파라미터
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
- corePoolSize: 기본적으로 유지되는 스레드 수
- maximumPoolSize: 최대 허용 스레드 수
- keepAliveTime: 초과 스레드의 유휴 상태 허용 시간
- workQueue: 작업이 처리되기 전에 대기하는 큐
📌 오해와 진실: ThreadPoolExecutor
⁉️ 오해 1: CorePoolSize를 넘어가면 바로 MaximumPoolSize만큼 스레드가 생성된다?
- CorePoolSize를 넘어가는 태스크들은 먼저 workQueue에 대기
- workQueue가 가득 찼을 때만 추가 스레드가 생성, 최대 MaximumPoolSize까지만 생성.
- 즉, 단계적 프로세스가 있으며 CorePoolSize → workQueue → 추가 스레드 순으로 진행
⁉️ 오해 2: 스레드 풀 생성 시 처음부터 corePoolSize만큼의 스레드가 준비된다?
- 스레드 풀 생성 시점에는 실제 스레드가 0개.
- 작업이 제출될 때마다 필요에 따라 새 스레드가 생성.
- corePoolSize에 도달한 후에야 스레드 수가 유지
⁉️ 오해 3: corePoolSize 이상의 스레드를 생성한 스레드 풀은 해당 스레드들을 계속 유지한다?
- corePoolSize 이상의 추가 스레드는 일시적으로만 존재
- 이러한 추가 스레드는 keepAliveTime 동안 유휴 상태가 지속되면 자동으로 종료
- 즉, 풀은 자동으로 corePoolSize로 축소
- corePoolSize 스레드는 유휴 상태에서도 유지
📌 스레드 풀 생성 시점에 스레드 생성 : prestartAllCoreThreads()
- 원래 기본 동작 : 스레드 풀 생성 시 스레드 생성x → 작업이 들어올 때 스레드 생성
- prestartAllCoreThreads() 메서드를 사용하면 초기에 모든 코어 스레드 생성 가능

📌 ThreadPoolExecutor의 스레드 생성 과정
- 처음에는 스레드가 없음 (0개)
- 스레드 풀 생성 시점에는 아무런 스레드도 생성되지 않음
- 작업 제출 시 현재 실행 중 스레드 < corePoolSize 이면 새 스레드 생성
- 작업이 들어오면 우선 새 스레드를 생성하여 작업 처리
- 이 과정은 스레드 수가 corePoolSize에 도달할 때까지 반복
- 실행 중 스레드 >= corePoolSize 이면 작업을 큐에 추가
- 코어 스레드 수에 도달하면 새 작업은 큐에 추가
- 큐에 있는 작업은 기존 스레드가 처리
- 큐가 가득 차면 maximumPoolSize까지 추가 스레드 생성
- 대기열까지 가득 차면 추가 스레드 생성 (최대 maximumPoolSize까지)
스터디 끝나고 숙제....
https://sudden-theory-8b7.notion.site/Async-Executor-1a85c15648f18099b430dc35fe3bcfc5?pvs=4