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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    大数据ClickHouse(十四):Integration系列表引擎
    目标检测系列算法:YOLOv6代码复现
    多御安全浏览器新版下载 | 功能优秀性能出众
    管理多租户环境之PDB快照
    图像运算和图像增强九
    k8s对接ceph,ceph-csi方式
    C语言经典例题-17
    Java使用DOM简单解析XML文件
    2022 uniapp基础掌握及面试题整理
    用于快速数字化转型的 7 大可观察性工具
  • 原文地址:https://blog.csdn.net/GBS20200720/article/details/127041676