目录
2.DiscardPolicy(丢弃当前被拒绝的任务,不抛出任何异常)
3.DiscardOldestPolicy(将工作队列中最老的任务丢弃,然后重新尝试接纳被拒绝的任务)
4.CallerRunsPolicy(在客户端执行被拒绝的任务)
总结
一、拒绝策略的执行条件
拒绝策略是在线程池执行任务的过程中使用的,首先我们要了解线程池执行任务的基本过程。每过来一个任务,就会启动一个核心线程去执行它,当核心线程都用完了,再过来任务就会存入到阻塞队列中,当阻塞队列也存满时,会扩充线程池中的线程数,如果线程数达到了最大线程数量时,再过来任务,就会启动拒绝策略。
二、拒绝策略分类
拒绝策略提供顶级接口 RejectedExecutionHandler ,当执行拒绝策略时,就会调用其中的 rejectedExecution 方法来具体执行拒绝策略。
关于RejectedExecutionHandler操作说明:当用户提交的任务被拒绝时,线程池所关联的RejectedEcecution方法就会被调用,ThreadPoolExecutor自身提供了几个现成的RejectedExecutorHandler接口的实现类,其中ThreadPoolExecutor.AbortPolicy是线程池使用的默认拒绝策略。如果默认的RejectedExecutionHandler无法满足要求,那么可优先考虑线程池自身提供的其他拒绝策略,其次考虑使用自身实现的RejectedExecutionHandler接口。
jdk默认提供了以下四种拒绝策略:
1.AbortPolicy(直接抛出异常)
丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。
源码如下:
在代码中可见,在rejectedExecution方法中抛出了RejectedExecutionException异常,会对代码的运行进行中止。
2.DiscardPolicy(丢弃当前被拒绝的任务,不抛出任何异常)
源码如下:
可以在方法rejectedExecution看到,没有任何的处理异常代码,对任务不做任何处理。
3.DiscardOldestPolicy(将工作队列中最老的任务丢弃,然后重新尝试接纳被拒绝的任务)
在rejectedExecution方法中可以看到,用了一个if语句判断,再调用队列的poll方法对队列中最老的任务进行丢弃,再将新的任务放入队列中
4.CallerRunsPolicy(在客户端线程执行被拒绝的任务)
直接调用其run方法,对新的任务进行优先执行。
总结
以上就是线程池的几种常见拒绝策略,在具体应用中应该分情况,根据不同需求选择使用哪一种拒绝策略。