TODAY 59
RejectExecutionHandler reject policy

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


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

RejectedExecutionHandler

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와 마찬가지로 일부 요청은 유실된다.