线程池中的拒绝策略有哪些?请列举并说明其适用场景。
Java中的线程池(ThreadPoolExecutor)提供了四种拒绝策略,当线程池无法处理新提交的任务时(比如线程池已关闭或线程池中的线程数已达到最大值,任务队列也已满),这些策略将决定如何处理这些无法处理的任务。
- AbortPolicy(默认策略):这个策略会直接抛出一个未检查的RejectedExecutionException异常,不对任务进行任何处理。这会导致调用者程序中断,可能不是我们想要的结果。
-
CallerRunsPolicy:这个策略会让提交任务的调用者线程直接执行这个任务,这样可以减轻线程池的压力,但是可能会导致调用者线程阻塞,影响调用者的后续操作。
-
DiscardPolicy:这个策略会直接丢弃无法处理的任务,不会抛出任何异常。如果允许任务丢失,这可能是一个合适的策略。
-
DiscardOldestPolicy:这个策略会丢弃任务队列中最旧的任务,然后尝试再次提交当前任务。这种策略可以在队列中保持最新任务,但可能导致某些任务永远无法执行。
根据实际业务场景和需求,可以选择合适的拒绝策略。如果需要自定义拒绝策略,可以实现RejectedExecutionHandler接口,并在创建ThreadPoolExecutor时将自定义的拒绝策略传入。