스레드 풀 포화 정책
스레드 풀과 작업 대기열이 가득 찬 포화 상태에서 새로운 작업 요청을 어떻게 처리할지 결정하는 정책이다.
포화 상태란
Java의 ThreadPoolExecutor는 상시 유지하는 스레드 수인 corePoolSize, 작업 대기열 크기인 workQueue, 추가로 늘릴 수 있는 최대 스레드 수인 maxPoolSize를 설정값으로 갖는다. 스레드가 maxPoolSize까지 늘어나고 대기열까지 꽉 찬 상태를 포화 상태라고 하며, 이때 새 작업이 들어오면 RejectedExecutionHandler의 구현체인 포화 정책이 실행된다.
포화 정책의 종류
RejectedExecutionHandler의 기본 구현체는 4가지다.
AbortPolicy:RejectedExecutionException을 발생시킨다.DiscardPolicy: 신규 요청을 조용히 무시한다.DiscardOldestPolicy: 대기열에서 가장 오래된 요청을 버리고 신규 요청을 대기열에 추가한다.CallerRunsPolicy: 요청을 보낸 스레드가 직접 해당 작업을 실행한다.
커스텀 정책
RejectedExecutionHandler 인터페이스를 직접 구현하면 원하는 포화 정책을 만들 수 있다.
class CustomPolicy implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// ...
}
}
@Async에서 커스텀 스레드 풀을 설정할 때도 setRejectedExecutionHandler()로 포화 정책을 지정할 수 있다.
핵심 정리
스레드 풀 포화 정책은 스레드와 대기열이 모두 가득 찬 상황에서 시스템을 어떻게 보호할지 결정하는 전략이며, 서비스 특성에 맞춰 기본 정책 중 하나를 고르거나 직접 구현해 사용할 수 있다.