java8中,线程池拒绝策略有哪些?默认是哪个?

在 Java 8 中,ThreadPoolExecutor 提供了四种内置的线程池拒绝策略,这些策略都实现了 RejectedExecutionHandler 接口:

  1. AbortPolicy(中止策略):
    这是默认的拒绝策略。当线程池无法处理新任务时,它会直接抛出一个RejectedExecutionException 异常。
  2. CallerRunsPolicy(调用者运行策略):
    当线程池无法处理新任务时,它不会抛出异常,而是直接在提交任务的线程中运行该任务。这提供了一种简单的降级机制,但请注意,如果提交任务的线程是一个重要的线程(例如,UI 线程),这可能会导致问题。
  3. DiscardPolicy(丢弃策略):
    当线程池无法处理新任务时,它什么也不做,直接丢弃这个任务。
  4. DiscardOldestPolicy(丢弃最旧策略):
    当线程池无法处理新任务时,它会丢弃工作队列中最旧的任务,然后尝试重新提交当前任务。
    默认的策略是 AbortPolicy,即当线程池无法处理新任务时,它会抛出 RejectedExecutionException 异常。

你可以通过调用 ThreadPoolExecutor 的 setRejectedExecutionHandler 方法来设置你想要的拒绝策略。例如:

ThreadPoolExecutor executor = new ThreadPoolExecutor(...);  
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

此外,你还可以实现自己的 RejectedExecutionHandler 来定义自己的拒绝策略,并将其设置到线程池中。这为你提供了高度的灵活性,可以根据应用的具体需求来定制拒绝策略。