天天看点

万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略

拒绝策略

下面再简单地实现一下

RejectedExecutionHandler

;

实现了接口的

rejectedExecution

方法,打印出当前线程池状态

万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略

ThreadPoolExecutor

中提供了四个公开的内部静态类

● AbortPolicy - 默认

丢弃任务并抛出

RejectedExecutionException

万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略

● DiscardPolicy - 不推荐

丢弃任务,但不拋异常.

万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略

DiscardOldestPolicy

抛弃队列中等待最久的任务,然后把当前任务加入队列中.

万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略

CallerRunsPolicy

当线程满队列满,任务会在提交任务的线程或调用execute方法的线程执行,也就是说不能认为提交到线程池的任务就一定是异步处理的。

若使用CallerRunsPolicy,有可能异步任务变同步执行,所以该拒绝策略很特别。

  • 调用任务的run()方法绕过线程池直接执行。
万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略

根据之前实现的线程工厂和拒绝策略,线程池的相关代码实现如下:

万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略
万字总结最全Java线程池ThreadPoolExecutor面试题(五)拒绝策略

当任务被拒绝的时候,拒绝策略会打印出当前线程池的大小已经达到了

maximumPoolSize=2

,且队列已满,完成的任务数提示已经有1个(最后一行)。

或许发现线程池因为任务处理不过来出现了异常,而又不希望线程池丢弃任务,所以有时会选择这样的拒绝策略。