QUESTION #0270
백엔드

스레드 풀 포화 정책이란 무엇인가요

스레드 풀 포화 정책이란 무엇인가요?

분야: 백엔드


자바의 ThreadPoolExecutor를 기준으로 설명해 드리겠습니다. 스레드 풀 포화 정책(Saturation Policies) 이란 말 그대로 스레드 풀이 포화 상태인 경우의 행동을 결정하는 정책을 의미합니다. ThreadPoolExecutor 설정에는 상시 유지하는 스레드의 수인 corePoolSize, 작업 대기열 크기인 workQueueSize, 스레드를 추가할 수 있는 최대 수인 maxPoolSize가 존재하는데요. 스레드가 maxPoolSize까지 늘어나고 대기열까지 꽉 찬 상태를 포화 상태라고 합니다. 이때 새로운 작업 요청이 들어오면, RejectedExecutionHandler의 구현체인 포화 정책이 실행됩니다.

포화 정책의 종류에는 무엇이 존재하나요?

포화 정책 종류는 RejectedExecutionHandler의 구현체를 기준으로 AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy, DiscardPolicy가 존재합니다.

  • AbortPolicy는 포화 상태일 경우, RejectedExecutionException을 발생시킵니다.
  • DiscardPolicy는 포화 상태일 경우, 신규 요청을 무시합니다.
  • DiscardOldestPolicy는 포화 상태일 경우, 작업 대기열에서 가장 오래된 요청을 버리고 신규 요청을 대기열에 추가합니다.
  • CallerRunsPolicy는 포화 상태일 경우, 요청 스레드에서 해당 작업을 실행합니다.

기본적으로 제공되는 포화 정책은 4가지지만, 직접 RejectedExecutionHandler 인터페이스를 구현하여 커스텀 포화 정책을 만들 수 있습니다.

class CustomPolicy implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // ... 중략
    }
}

추가 학습 자료를 공유합니다.