处理被拒绝的执行

如果

  1. 你尝试将任务提交给关闭 Executor 或
  2. 队列已饱和(仅限有限队列)并且已达到最大线程数,

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)