在 Java 8 中,ThreadPoolExecutor 提供了四种内置的线程池拒绝策略,这些策略都实现了 RejectedExecutionHandler 接口:
- AbortPolicy(中止策略):
这是默认的拒绝策略。当线程池无法处理新任务时,它会直接抛出一个RejectedExecutionException 异常。 - CallerRunsPolicy(调用者运行策略):
当线程池无法处理新任务时,它不会抛出异常,而是直接在提交任务的线程中运行该任务。这提供了一种简单的降级机制,但请注意,如果提交任务的线程是一个重要的线程(例如,UI 线程),这可能会导致问题。 - DiscardPolicy(丢弃策略):
当线程池无法处理新任务时,它什么也不做,直接丢弃这个任务。 - DiscardOldestPolicy(丢弃最旧策略):
当线程池无法处理新任务时,它会丢弃工作队列中最旧的任务,然后尝试重新提交当前任务。
默认的策略是 AbortPolicy,即当线程池无法处理新任务时,它会抛出 RejectedExecutionException 异常。
你可以通过调用 ThreadPoolExecutor 的 setRejectedExecutionHandler 方法来设置你想要的拒绝策略。例如:
ThreadPoolExecutor executor = new ThreadPoolExecutor(...);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
此外,你还可以实现自己的 RejectedExecutionHandler 来定义自己的拒绝策略,并将其设置到线程池中。这为你提供了高度的灵活性,可以根据应用的具体需求来定制拒绝策略。