스레드 풀 포화 정책이란 무엇인가요?
분야: 백엔드
자바의 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) {
// ... 중략
}
}