线程池的拒绝策略是什么?拒绝策略有哪些?

XIAO 2020-04-17 22:45:15 java常见问答 5095

如果有了解过线程的话,那对线程池应该也是不陌生的,但是可能还是有不少小伙伴没有了解过线程池的拒绝策略,有兴趣了解的伙伴,接下来就跟小编一起来看看线程池的拒绝策略是什么,以及拒绝策略有哪些。

首先我们来看看什么是线程池的拒绝策略?

所谓拒绝策略,就是表示当队列满了并且工作线程大于等于线程池的最大线程数,线程池会按照设定的拒绝策略(四种)进行对应的拒绝。

那么拒绝策略应该什么时候用呢?

如果说等待队列也已经排满了,再也塞不下新任务了,同时,线程池中的max线程也达到了尽头,无法继续为新任务服务。这时候我们可能就需要拒绝策略机制合理的去处理这个问题。

线程池四种拒绝策略简介如下所示:

AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行。

CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会丢弃任务,也不会抛出异常,而是将某些任务回退给调用者,从而降低新任务的流量。

DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。

DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。

如果说一个任务通过 execute(Runnable) 方法被添加到线程池,该任务就是一个 Runnable 类型的对象,任务的执行方法就是 Runnable 类型对象的 run() 方法。

当一个任务通过 execute(Runnable) 方法欲添加到线程池时,线程池采用的策略如下:

如果此时线程池中的数量是小于 corePoolSize 的,那么即使线程池中的线程全部都处于空闲状态,也是要创建新的线程来处理被添加的任务。

如果说此时线程池中的数量等于 corePoolSize ,但是呢,缓冲队列 workQueue 又未满,这样的话任务就会被放入缓冲队列。

如果此时线程池里面的数量大于 了corePoolSize ,缓冲队列 workQueue已满,并且线程池中的数量还小于maximumPoolSize ,那么建新的线程就会来处理被添加的任务。

如果此时线程池中的数量大于 corePoolSize ,缓冲队列 workQueue 已满,并且线程池中的数量等于maximumPoolSize ,那么通过 handler 所指定的策略来处理此任务。

那么以上就是关于线程池拒绝策略的所有内容了,还想了解更多java一些知识问答,那么记得关注本站消息哦。