目录
Java线程池的拒绝策略是指 当线程池无法接受更多任务时采取的行为策略,通常发生在线程池已经达到最大线程数、工作队列也已满载的时候。
Java的
java.util.concurrent.RejectedExecutionHandler
接口定义了拒绝策略,并自带几个常用的实现。-
AbortPolicy(默认策略):
- 当线程池无法接受新任务时,会抛出
RejectedExecutionException
异常。这种策略要求调用者捕获异常并处理,适用于关键业务场景,需要明确知道任务被拒绝的情况。
- 当线程池无法接受新任务时,会抛出
-
CallerRunsPolicy:
- 如果线程池无法执行新任务,那么提交任务的线程(调用者线程)会自己执行该任务。这适用于并发较低、对性能要求不高的场景,可以确保任务不被丢弃,但可能导致调用线程阻塞,影响整体吞吐量。
-
DiscardPolicy:
- 静默丢弃无法处理的任务,不执行任何操作,也不会抛出异常。适用于可以容忍任务丢失的场景,比如非关键性的统计或日志记录。
-
DiscardOldestPolicy:
- 丢弃队列中最旧的任务(即最早提交但还未被执行的任务),然后尝试重新提交当前任务。这要求任务的提交顺序不影响业务逻辑,且可以接受较旧的任务被丢弃。
除此之外,我们还可以通过实现RejectedExecutionHandler
接口来自定义策略,例如记录日志、将任务转移到其他队列或使用降级策略执行任务等。