处理被拒绝的执行
如果
- 你尝试将任务提交给关闭 Executor 或
- 队列已饱和(仅限有限队列)并且已达到最大线程数,
RejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor)
将被召唤。
默认行为是你将在调用者处抛出 RejectedExecutionException。但是有更多预定义的行为可用:
- ThreadPoolExecutor.AbortPolicy (默认情况下,将抛出 REE)
- ThreadPoolExecutor.CallerRunsPolicy (在调用者的线程上执行任务 - 阻止它 )
- ThreadPoolExecutor.DiscardPolicy (静默丢弃任务)
- ThreadPoolExecutor.DiscardOldestPolicy (以静默方式丢弃队列中最旧的任务并重试执行新任务)
你可以使用其中一个 ThreadPool 构造函数设置它们 :
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) // <--
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) // <--
你还可以通过扩展 RejectedExecutionHandler 接口来实现自己的行为 :
void rejectedExecution(Runnable r, ThreadPoolExecutor executor)