RejectExecutionHandler reject policy

Threadpoolexecutor 를 사용하다보면 한가지 의문점이 생깁니다.

Pool에 가득 차게된 이후에 이벤트가 들어오면 어떻게 될까 ?


public interface RejectedExecutionHandler {

     * Method that may be invoked by a {@link ThreadPoolExecutor} when
     * {@link ThreadPoolExecutor#execute execute} cannot accept a
     * task.  This may occur when no more threads or queue slots are
     * available because their bounds would be exceeded, or upon
     * shutdown of the Executor.
     * <p>In the absence of other alternatives, the method may throw
     * an unchecked {@link RejectedExecutionException}, which will be
     * propagated to the caller of {@code execute}.
     * @param r the runnable task requested to be executed
     * @param executor the executor attempting to execute this task
     * @throws RejectedExecutionException if there is no remedy
    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);

RejectedExecutionHandler는 ThreadPoolExecutor에서 task를 더 이상 받을 수 없을 때 호출된다.

이런 경우는 큐 허용치를 초과하거나 Executor가 종료되어서 Thread 또는 큐 슬롯을 사용할 수 없는 경우에 발생한다.

Reject Policy

Executor는 작업 큐가 꽉 찼을 때 아래 4가지 정책 중에 하나를 선택해서 사용할 수 있다.

1. ThreadPoolExecutor.AbortPolicy

 - Default로 설정되어있다. Reject 된 Task가 RejectedExecutionException 를 던지며 끝난다.

2. ThreadPoolExecutor.CallerRunsPolicy

 - 호출한 Thread가 Reject 된 Task를 대신실행한다.

3. ThreadPoolExecutor.DiscardPolicy

 - Reject 된 Task는 버리며, Exception 도 발생하지 않는다.

4. ThreadPoolExecutor.DiscardOldestPolicy

 - Thread 를 종료하지 않고, 대기열에서 가장 오래된 큐를 버리고, 요청을 실행한다.
 - DiscardPolicy와 마찬가지로 일부 요청은 유실된다.