美文网首页
线程池-SynchronousQueue是否会导致拒绝策略?

线程池-SynchronousQueue是否会导致拒绝策略?

作者: 雨之都 | 来源:发表于2024-01-29 19:03 被阅读0次

答案是会!以下为详细的解释。

SynchronousQueue是没有容量的队列,往队列里插入一个元素,下一次插入会陷入阻塞,直到之前的元素被其他消费者给取走。

在线程池的上下文中,为了简化讨论情况,这里假设核心线程不允许死亡(除非崩溃)。站在线程池的视角,当一个新任务来的时候,它是怎么处理的呢

  1. 如果当前的线程数量数量小于核心线程数,线程池倾向于创建新的线程处理新的任务,
  2. 否则尝试将任务加入到队列中,java提供的阻塞队列抽象中有offer和put两个方法,其中offer是条件满足则进行插入,否则直接返回,put则是条件不满足的情况下会进行阻塞等待,上文中我这里用了“尝试将任务加入到队列”这种说法,意思是指这里使用是offer的方式入队,
  3. 失败的情况下,如果当前线程数没有超过线程池配置的最大线程数的话,会尝试创建新的线程去处理,否则执行拒绝策略。成功的情况下就加入队列,等待其他线程取到该任务去执行。

回到我们的上下文,若尝试将任务插入到SynchronousQueue的过程中发现无法插入,也就是说此队列的上一个任务尚未被调度完成,这个时候就会走到“尝试创建新的线程去调度该任务的过程”。那如果这个时候最大线程数已经达到了,那么就无法创建线程了,自然就会执行拒绝策略了。

因此,实践中,如果我们决定使用SynchronousQueue作为我们的线程池配置,由于这个阻塞队列的特性,我们期望的是立刻有线程接受这个任务,换言之,要么将最大线程数设置得很大,比如Int.Max,Executors中的newCachedThreadPool使用的就是这种方式,要么我们必须有一个认知,我们提交给线程池的任务执行时间不长,下一个任务来的时候一般有空闲的线程或者能够创建新的线程进行处理(这个认知可能随着app的迭代被打破),如果以上两个条件都不满足,就享受拒绝策略吧,而在安卓中,默认的线程拒绝策略会杀死整个app(喜提线上崩溃),所以使用SynchronousQueue需要万分小心。

相关文章

  • Java线程池拒绝策略

    【Java线程池拒绝任务策略】创建线程池可以指定拒绝策略如下: 一 拒绝时机1) 调用线程池的shutdown函数...

  • ThreadPoolExecutor

    线程池 拒绝策略 线程池的拒绝策略,即任务被添加到线程池中被拒绝而采取的处理措施。任务被拒绝的原因可能有: 线程池...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

  • 2021-05-28

    线程池拒绝策略1.abortpolicy 默认的拒绝策略,会丢弃任务,抛出异常RejectedExecution...

  • ThreadPoolExecutor的RejectedExecu

    java 线程池ThreadPoolExecutor的拒绝策略有: CallerRunsPolicy : 当线程池...

  • 线程池

    线程池执行过程 线程池生命周期 线程池分类 阻塞队列 拒绝策略 - ThreadPoolExecutor.Abor...

  • 线程池概述

    为什么要使用线程池? 线程池核心参数 线程池的几种拒绝策略 execute()和submit()的区别 线程池工作...

  • 信号量用法:锁

    用于dubbo线程池满的拒绝策略

  • Executors线程池

    newCacheThreadPool(缓存线程池):阻塞队列为SynchronousQueue,核心线程数0,最大...

  • 线程池-四种拒绝策略总结

    一、线程池的拒绝策略线程池中,有三个重要的参数,决定影响了拒绝策略:corePoolSize - 核心线程数,也即...

网友评论

      本文标题:线程池-SynchronousQueue是否会导致拒绝策略?

      本文链接:https://www.haomeiwen.com/subject/gitnodtx.html