• 关于线程池的常见问题


    一,对于线程池的理解

         管理线程的池子,线程池内部维护了若干个线程,没有任务时,所有线程都处于等待状态,如果有任务,线程池就会自动的分配给内部的空闲线程,如果当前没有空闲线程,则任务进入等待状态,进入队列,或者添加一个新线程。

    线程池的优点(相比于手工创建,运行线程):

    1. 降低线程创建和销毁时对系统的开销
    2. 提高响应速度
    3. 提高线程的可管理性:由线程池统一分配资源,也方便我们统一管理线程的创建核心参数。

     

     二,线程池的核心参数

    1. corePoolSize(线程池核心线程数量):就是线程池最小线程数的维护数量,如果超过了核心线程数量,这些线程会在空闲时间超过keepAliveTime后,被回收
    2. maximumPoolSize(线程池允许创建的最大线程数量):包括核心线程数在内
    3. keepAliveTime(非核心线程存活时间)
    4. TimeUnit(存活时间的单位)
    5. BlockingQueue(阻塞工作队列):用于存放等待执行的任务
    6. ThreadFactory(线程工厂):用于设置创建线程的工厂
    7. RejectedExecutionHAndler(拒绝策略):当线程池中线程都被占用, 且阻塞队列已满,新提交的任务使用的拒绝策略。

     

    拒绝策略:

                 AbortPolicy :默认策略(丢弃任务并抛出异常)

                 DiscardPolicy:丢弃任务,但是不抛出异常

                 DiscardOldestPolicy:丢弃队列中的末尾任务

                 CallerRunsPolicy:由原调用线程处理该任务

     

     

    三,线程池的执行流程

    1. 判断当前线程池中是否有空闲线程,如果有,则分配一个空闲线程用于执行任务
    2. 如果没有,判断当前存活的线程是否小于核心线程数,若小于,则创建一个核心线程用于执行任务
    3. 如果大于核心线程数,则判断工作队列时否已满,未满,进入进入队列等待
    4. 如果等待队列已满,则判断线程数是否小于最大线程数量,如果小于,则创建一个非核心线程,用于执行
    5. 如果大于最大线程数量,则直接执行拒绝策略

     

    a6082b1e1cbb40c2a9e3374a9d899900.png 

    四,常见线程池有哪些以及使用场景

    (1)newFixedThreadPool(固定数量的线程池)

          适合处理CPU密集型的任务,在线程需要长期使用的情况下,使用此线程池可以有效的减少系统消耗。

    (2)newCachedThreadPool(可缓存线程的线程池)

          适合用于并发执行大量短小的任务

    (3)newSingleThreadExecutor(单线程的线程池)

          适合执行串行的任务,即任务一个一个执行

    (4)ScheduledThreadPool(定时,周期任务的线程池)

          适合周期性处理线程任务,需要限制线程数量的任务

     

    五,为什么要使用线程池 

    (1)降低资源的消耗,通过重复利用以创建的线程来避免线程的创建与销毁对系统造成的消耗。

    (2) 提高了响应速度,当任务需要执行时,不需要重复创建线程的流程

    (3)提高线程的可管理性,线程是稀缺资源,要避免无限制的创建,否则会造成系统资源浪费,还会降低系统的稳定性。还可以自己统一配置核心参数,开发效率有一定的提高。

     

    六,线程池的工作队列

    (1)ArrayBlockingQueue(有界队列)

            用数组实现的有界堵塞队列,按FIFO排序

    (2)LinkedBlockingQueue(可设置容量队列)

            基于链表结构的阻塞队列,按FIFO排序,容量可进行选择设置,如果不设置,默认为Integer_MAX_VALUE,吞吐量高于ArrayBlockingQueue(在newFixedThreadPool线程池中有用到)

    (3)DelayedWorkQueue(延迟队列)

             任务定时周期的延迟执行的队列,根据指定的时间从大到小排列,否则根据插入队列的先后排序(newSchdutedThreadPool线程池中用到 )

    (4)prioprityBlockingQueue(优先级队列)

              具有优先级的无界阻塞队列

    (5)SynchronousQueue(同步队列)

              不储存元素的阻塞队列,每一个插入操作都必须等另一个调用移除操作之后,否则插入操作会一直处于阻塞状态。

                   

    七,线程池的状态

             线程池有这几个状态:RUNNING,  SHUTDOWN,  STOP,  TEDYING,  TERMINTED

    (1)RUNNING

              该状态下,线程会接受新任务,并处理阻塞队列中的任务。

    (2)SHUTDOWN

             该状态下,线程不会处理新任务,但会处理阻塞队列中的任务。

    (3)STOP

             该状态下,线程不会处理新任务,也不会处理阻塞队列的任务,而且会中断正在执行的任务。

    (4)TEDYING

              该状态表明所有的任务运行终止,而且记录的任务数量为零

    (5)TERMINTED

               该状态表明线程彻底终止。

     

     

  • 相关阅读:
    描述符——设备描述符
    《Python基础教程》专栏总结篇
    遗传算法优化的神经网络,遗传算法 优化
    手动编译与安装Qt的子模块
    软件设计师——信息安全知识
    开发人员的首选:CodeWhisperer
    动作捕捉助力无源上肢外骨骼的基础协调性评估
    @Reference 、@Resource和@Autowired的简单区分
    LeetCode 1700. 无法吃午餐的学生数量:真假模拟(极简代码) + 奇技淫巧
    YOLO目标检测——汽车头部尾部检测数据集【含对应voc、coco和yolo三种格式标签】
  • 原文地址:https://blog.csdn.net/weixin_54535063/article/details/126840023