ThreadPoolExecutor参数及执行流程

本文详细解析ThreadPoolExecutor的工作机制,包括任务提交后如何根据线程池的当前状态决定是创建新线程、放入任务队列还是执行拒绝策略。重点关注线程池的核心线程数、最大线程数、任务队列以及拒绝策略的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

  1. 任务提交给线程池
  2. 如果线程池中线程数小于核心线程数,则创建一个新的线程来执行该任务。否则进入步骤3
  3. 提交任务时,线程池中的空闲的线程数为0并且线程数等于核心线程数,则观察线程池中的任务队列是否已满,如果未满则将任务添加到任务队列,否则进入步骤4
  4. 如果最大线程数大于核心线程数,并且总线程数小于最大线程数,则创建一个新的线程来执行该任务。否则进入步骤5
  5. 当任务队列已满时,就执行拒绝策略(后续详解拒绝策略

ThreadPoolExecutor

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
                            // ...
    }

参数说明

参数说明
corePoolSize核心线程数
maximumPoolSize最大线程数,一般大于等于核心线程数
keepAliveTime线程存活时间(针对最大线程数大于核心线程数时,非核心线程)
unit存活时间单位,和线程存活时间配套使用
workQueue任务队列
threadFactory创建线程的工程
handler拒绝策略

拒绝策略有以下几种

拒绝策略说明
AbortPolicy为java线程池默认的阻塞策略,不执行此任务,而且直接抛出一个运行时异常。
DiscardOldestPolicy丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
DiscardPolicy也是丢弃任务,但是不抛出异常
CallerRunsPolicy由调度线程处理该任务
### 线程池的参数配置 `ThreadPoolExecutor` 是 Java 中实现线程池的核心类,其构造函数提供了多个重要参数用于控制线程池的行为。以下是这些参数的具体含义: - **corePoolSize**: 核心线程数,表示线程池中始终保持活动状态的最小线程数量,即使它们处于空闲状态也不会被回收[^3]。 - **maximumPoolSize**: 最大线程数,表示线程池允许的最大并发线程数量。当活跃线程达到此上限时,新的任务会被放入队列等待处理。 - **keepAliveTime**: 非核心线程闲置后的存活时间。如果当前线程数超过 `corePoolSize`,那么超出部分的线程会在空闲超过指定的时间后被终止。 - **unit**: 时间单位,配合 `keepAliveTime` 使用,定义了超时时长的计量单位,例如秒 (`SECONDS`) 或毫秒 (`MILLISECONDS`) 等。 - **workQueue**: 任务队列,用来存储提交但尚未被执行的任务。常见的队列类型包括无界队列 (LinkedBlockingQueue) 有界队列 (ArrayBlockingQueue)。 - **threadFactory**: 可选参数,用于定制化线程工厂,决定如何创建新线程。 - **handler**: 拒绝策略处理器,在线程池无法继续接受新任务时触发特定逻辑,比如抛出异常或丢弃最旧任务。 ### 工作原理与流程图 #### 工作原理 1. 当向线程池提交一个任务时,首先判断当前运行中的线程数目是否小于 `corePoolSize`。如果是,则新建一个线程来执行该任务。 2. 如果当前线程数已经达到 `corePoolSize` 并且还有未完成的任务,则将任务加入到 `workQueue` 中排队等候处理。 3. 若队列已满而此时线程总数仍低于 `maximumPoolSize` 的限制,则会额外启动一些临时线程直到达到最大容量。 4. 超过 `maximumPoolSize` 后再尝试提交的新任务将会依据所设定的拒绝策略进行相应操作。 #### 流程图描述 ```plaintext +-------------------+ | 提交任务 | +-------------------+ | v +-------------------+ | 判断线程数<Core? |----Yes---> 创建新线程 -> 执行任务 +-------------------+ No | | v v +-------------------+ +-------------------+ | 加入Work Queue | | 判断线程数<Max? |--Yes--> 新建线程 -> 执行任务 +-------------------+ +-------------------+ No | | v v +-------------------+ Reject Policy Handler | 等待执行 | +-------------------+ ``` ### 自定义扩展功能 为了满足更复杂的业务需求,可以通过继承 `ThreadPoolExecutor` 来覆盖默认行为。例如重写的三个主要方法分别是 `beforeExecute(Thread t, Runnable r)`、`afterExecute(Runnable r, Throwable t)` `terminated()` 方法,分别对应于每次任务执行之前的操作、之后的操作以及整个线程池关闭之前的清理动作[^2]。这种机制非常适合做性能统计或者日志记录等工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值