【编程底层思考】详述ThreadPoolExecutor线程池的所有参数及其含义,以及线程池在处理任务时的完整处理过程

在Java中,java.util.concurrent包提供了一套线程池执行器(Executor)的丰富实现,其中ThreadPoolExecutor是线程池的具体实现类。Executors类则是一个工厂类,用于方便地创建不同类型的线程池。

以下是ThreadPoolExecutor构造函数的参数及其含义

  1. corePoolSize:线程池的基本大小,即在没有任务执行时线程池的大小。
  2. maximumPoolSize:线程池能够容纳同时执行的最大线程数量。值得注意的是,如果使用无界队列(例如LinkedBlockingQueue)来存放任务,那么实际池大小会达到这个值。
  3. keepAliveTime:当线程数大于corePoolSize时,多余的空闲线程能够存活的时间。如果线程池中的线程数量超过corePoolSize,而任务数量又不足以保持这些线程忙碌,那么多余的线程将被终止,但是会等待keepAliveTime时间。
  4. unit:keepAliveTime参数的时间单位,如秒、毫秒等。
  5. workQueue:一个阻塞队列,用于存储等待执行的任务。这个队列决定了当所有线程都在忙碌时,新任务该如何排队等待。
  6. threadFactory:用于创建新线程的工厂。你可以通过这个工厂为线程设置有意义的名字,或者设置其他线程属性。
  7. handler :饱和策略,当任务太多来不及处理时,线程池会根据这个饱和策略来拒绝任务。常见的饱和策略有 - ThreadPoolExecutor.AbortPolicy:抛出RejectedExecutionException来拒绝新任务的处理。
    • ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务(如果线程不是来自线程池)。
    • ThreadPoolExecutor.DiscardPolicy:默默地丢弃无法执行的任务。
    • ThreadPoolExecutor.DiscardOldestPolicy:丢弃最老的一个请求,然后尝试再次提交当前任务。

线程池处理任务的完整过程如下

  1. 提交任务:将一个实现了Runnable接口的任务提交给线程池执行。
  2. 运行状态检查:线程池首先检查自己的运行状态。如果线程池已经被关闭,并且使用了shutdown()方法,那么将拒绝新任务。
  3. 核心线程判断:如果线程池中的线程数量小于corePoolSize,那么线程池会创建一个新线程来执行任务。
  4. 任务队列判断:如果线程池中的线程数量等于corePoolSize,并且所有线程都在忙碌状态,那么新提交的任务将被放入任务队列中等待。
  5. 最大线程判断:如果任务队列已满,且线程池中的线程数量小于maximumPoolSize,那么线程池会创建一个新线程来执行任务。
  6. 饱和策略执行:如果任务队列已满,且线程池中的线程数量等于maximumPoolSize,那么线程池将根据设定的饱和策略来处理任务。
  7. 任务执行:一旦线程空闲下来或者新线程被创建,它会从任务队列中取出一个任务来执行。
  8. 线程回收:如果线程空闲时间超过keepAliveTime,并且线程池中的线程数量大于corePoolSize,那么这个线程将被终止。
  9. 任务完成:当任务执行完毕后,线程将返回步骤7继续等待并执行新的任务。
  10. 线程池关闭:当没有更多的任务需要执行,并且所有任务都已完成时,线程池可以关闭。调用shutdown()方法会等待正

当提交一个新任务给线程池时,线程池的处理流程如下

  1. 如果运行的线程少于核心线程数,则创建一个新线程来执行任务。
  2. 如果运行的线程等于核心线程数,并且任务队列未满,则将任务放入任务队列。
  3. 如果任务队列满了,并且运行的线程少于最大线程数,则创建一个新线程来执行任务。
  4. 如果任务队列满了,并且运行的线程等于最大线程数,则根据饱和策略处理任务。

总结

在执行的任务完成,而调用shutdownNow()方法则会尝试停止正在执行的任务,并立即返回等待执行的任务列表。

使用线程池可以有效地管理线程的生命周期,减少资源消耗,并提高应用程序的响应速度和吞吐量。

相关推荐
蜡笔小新星14 分钟前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
IT猿手15 分钟前
2025最新群智能优化算法:海市蜃楼搜索优化(Mirage Search Optimization, MSO)算法求解23个经典函数测试集,MATLAB
开发语言·人工智能·算法·机器学习·matlab·机器人
夏天的味道٥3 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
IT、木易4 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
Mr.NickJJ5 小时前
JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件
开发语言·javascript·react.js
浪九天6 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
Archer1946 小时前
C语言——链表
c语言·开发语言·链表
My Li.6 小时前
c++的介绍
开发语言·c++