ThreadPoolExecutor에 대한 오해

Mando·2025년 3월 2일
1

JAVA

목록 보기
11/12

에코노 새싹 스터디에서 동시성에 대해서 공부하고 있고
이를 위해 정리한 자료이다.

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의 스레드 생성 과정


  1. 처음에는 스레드가 없음 (0개)
    • 스레드 풀 생성 시점에는 아무런 스레드도 생성되지 않음
  2. 작업 제출 시 현재 실행 중 스레드 < corePoolSize 이면 새 스레드 생성
    • 작업이 들어오면 우선 새 스레드를 생성하여 작업 처리
    • 이 과정은 스레드 수가 corePoolSize에 도달할 때까지 반복
  3. 실행 중 스레드 >= corePoolSize 이면 작업을 큐에 추가
    • 코어 스레드 수에 도달하면 새 작업은 큐에 추가
    • 큐에 있는 작업은 기존 스레드가 처리
  4. 큐가 가득 차면 maximumPoolSize까지 추가 스레드 생성
    • 대기열까지 가득 차면 추가 스레드 생성 (최대 maximumPoolSize까지)

스터디 끝나고 숙제....

https://sudden-theory-8b7.notion.site/Async-Executor-1a85c15648f18099b430dc35fe3bcfc5?pvs=4

0개의 댓글