• 什么是线程的拒绝策略&&核心线程数打满后就直接创建新线程吗


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    同花顺平台指标源码 【控盘度指标线】
    PowerBI 8月更新,数据标签条件格式
    Java项目:ssm+mysql医药进销存系统
    单例设计模式,各种排序复习
    改性三磷酸盐研究:Lumiprobe氨基-11-ddUTP
    数据安全法 笔记
    聚观早报 | 微软将推出首款AI芯片;Galaxy S24系列首发
    .NET周刊【11月第2期 2023-11-12】
    5. 使用PyTorch预先训练的模型执行目标检测
    zookeeper ACL权限控制
  • 原文地址:https://blog.csdn.net/GBS20200720/article/details/127041676