• 【面试:并发篇38:多线程:线程池】ThreadPoolExecutor类的基本概念


    【面试:并发篇38:多线程:线程池】ThreadPoolExecutor类的基本概念

    00.前言

    如果有任何问题请指出,感谢。

    01.介绍


    ThreadPoolExecutor类实现了ExecutorService接口,他与ScheduledThreadPoolExecutor类的不同是ScheduledThreadPoolExecutor是带有任务调度功能的线程池实现 这个我们之后再讲。

    02.ThreadPoolExecutor-池状态

    ThreadPoolExecutor使用int的高3位来表示线程池状态,第29位表示线程数量

    状态名高3位接收新任务处理阻塞队列任务说明
    RUNNING111YY
    SHUTDOWN000NY不会接收新任务,但会处理阻塞队列剩余任务
    STOP001会中断正在执行的任务,并抛弃阻塞队列任务
    TIDYING010任务全执行完毕,活动线程为0即将进入终结
    TERMINAIED011终结状态
    为什么线程池状态与线程池数量要用一个数字表示,而不用两个数字,原因是这两个信息存储在一个原子变量ctl中,这样以后就可以只用一次cas原子操作进行赋值。

    03.构造方法


    我们可以看到ThreadPoolExecutor类的构造方法有很多参数,我们一个一个解释
    corePoolSize:核心线程数目
    maximumPoolSize:最大线程数目
    keepAliveTime:生存时间-针对急救线程
    unit:时间单位-针对救急线程
    workQueue:阻塞队列
    threaFactory:线程工厂-可以为线程创建时起名
    hander:拒绝策略

    ThreadPoolExecutor与我们自定义线程池的区别

    1. 救急我们自定义线程池,线程池中只有一种线程就是核心线程,且我们的核心线程有take方法与pull方法。但ThreadPoolExecutor线程池有两种线程 一种是核心线程 数量时corePoolSize,一种是救急线程 数量是maximumPoolSize-corePoolSize,且核心线程只有take方法 救急线程只有pull方法,这就是为什么keepAlivTime与unit只针对救急线程。
    2. 自定义线程池不能规定线程池中线程的名字,ThreadPoolExecutor线程池则可以通过threaFactory参数改变线程的名字
    3. 自定义线程池与ThreadPoolExecutor线程池的拒绝策略

    工作方式

    介绍

    我们知道自定义线程池中只有核心线程,所以自定义线程池的流程是
    创建任务->交给空闲的核心线程执行->超出部分的任务放入任务队列->如果此时有空闲核心线程则从任务队列里获取任务执行->如果没有空闲线程 且任务队列也满了->生产线程执行拒绝策略
    ThreadPoolExecutor线程池中有核心线程与救急线程,所以ThreadPoolExecutor线程池的流程是
    补充:ThreadPoolExecutor线程池的核心线程没有超时时间,救急线程有。
    创建任务->交给空闲核心线程执行->超出部分的任务放入任务队列->如果此时有空闲核心线程->如果此时有空闲核心线程则从任务队列里获取任务执行交给核心的->如果没有空闲线程 且任务队列也满了->创建救急线程 多出的任务交给救急线程执行->如果救急线程也没有空闲了->生产线程执行拒绝策略

    解释

    可以看出救急线程的作用是在核心线程与任务队列都满的情况下 创建救急线程 如果救急线程在超时时间内没有获取到任务则从线程池中移除。

    拒绝策略

    如果核心线程没有空闲 任务队列满了 救急线程没有空闲,在这种情况下执行拒绝策略,拒绝策略jdk提供了四种实现。

    1. AbortPolicy 让调用者抛出 RejectedExecutionException 异常,这是默认策略
    2. CallerRunsPolicy 让调用者运行任务
    3. DiscardPolicy 放弃本次任务
    4. DiscardOldestPolicy 放弃队列中最早的任务,本任务取而代之
  • 相关阅读:
    物联网时代的等保测评:保障万物互联的安全
    java反射的使用
    c++视觉图像线性混合
    FPGA工程师面试——基础概念问题整理
    如何使用树莓派制作避障机器人
    O - Muddy roads
    Java Web 6 HTML & CSS 6.2 CSS
    MySQL数据库(5)——逻辑处理
    重磅发布!RflySim Cloud 智能算法云仿真平台亮相,助力大规模集群算法高效训练
    springboot导入excel(POI)
  • 原文地址:https://blog.csdn.net/m0_71229547/article/details/126080334