Java线程池中的四种拒绝策略

Posted zjh996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程池中的四种拒绝策略相关的知识,希望对你有一定的参考价值。

  1. CallerRunsPolicy:这是默认的拒绝策略,当线程池队列已满并且无法处理新任务时,将由提交任务的线程来执行该任务。这种策略可以降低新任务的流量,但也会增加提交任务的线程的负载。

  2. AbortPolicy:当线程池队列已满并且无法处理新任务时,将抛出RejectedExecutionException异常,阻止新任务的提交。

  3. DiscardPolicy:当线程池队列已满并且无法处理新任务时,将默默地丢弃该任务,不会给出任何提示或警告。

  4. DiscardOldestPolicy:当线程池队列已满并且无法处理新任务时,将丢弃队列中最早的未处理任务,并尝试重新提交新任务。这种策略可以保证不会丢失任何任务,但可能会影响到队列中已经等待很长时间的任务。

JAVA线程池的拒绝策略有哪几种?

当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize时,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:

AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

这是线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态。如果是比较关键的业务,推荐使用此拒绝策略,这样子在系统不能承载更大的并发量的时候,能够及时的通过异常发现。

DiscardPolicy:丢弃任务,但是不抛出异常。 如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。

DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务

CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

用户还可以自定义拒绝策略:实现RejectExecutionHandler接口,实现rejectedExecution方法,自定义策略模式。

具体使用哪种策略,还得根据实际业务场景才能做出抉择。

以上是关于Java线程池中的四种拒绝策略的主要内容,如果未能解决你的问题,请参考以下文章

jdk线程池的四种拒绝策略

线程池的拒绝策略示例

Java八股系列——线程池拒绝策略

JAVA线程池的拒绝策略有哪几种?

java线程池工作原理及拒绝策略详解

java多线程系类:JUC线程池:05之线程池原理(转)