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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    2022-10洛谷
    【华为OD题库-008】座位调整-Java
    C语言数组和指针笔试题(五)(一定要看)
    Python进阶系列 - 20讲 with ... as:
    解决Devops部署Java应用中文乱码
    Boost ASIO :I/O Services and I/O Objects
    CAS:139554-72-6 _Biotin-Mal生物素修饰的怀槐凝集素价格
    那些工作1年顶5年的项目经理,是如何思考和成长的?【大海午餐14】
    01 WIFI ----- SDIO接口驱动
    【STM32】LCD液晶显示
  • 原文地址:https://blog.csdn.net/GBS20200720/article/details/127041676