拒绝策略
下面再简单地实现一下
RejectedExecutionHandler
;
实现了接口的
rejectedExecution
方法,打印出当前线程池状态
在
ThreadPoolExecutor
中提供了四个公开的内部静态类
● AbortPolicy - 默认
丢弃任务并抛出
RejectedExecutionException
● DiscardPolicy - 不推荐
丢弃任务,但不拋异常.
DiscardOldestPolicy
抛弃队列中等待最久的任务,然后把当前任务加入队列中.
CallerRunsPolicy
当线程满队列满,任务会在提交任务的线程或调用execute方法的线程执行,也就是说不能认为提交到线程池的任务就一定是异步处理的。
若使用CallerRunsPolicy,有可能异步任务变同步执行,所以该拒绝策略很特别。
- 调用任务的run()方法绕过线程池直接执行。
根据之前实现的线程工厂和拒绝策略,线程池的相关代码实现如下:
当任务被拒绝的时候,拒绝策略会打印出当前线程池的大小已经达到了
maximumPoolSize=2
,且队列已满,完成的任务数提示已经有1个(最后一行)。
或许发现线程池因为任务处理不过来出现了异常,而又不希望线程池丢弃任务,所以有时会选择这样的拒绝策略。