ThreadPoolExecutor执行过程详解

流程图说明:

主流程(任务提交):
  1. 提交任务:调用 execute(Runnable) 方法

  2. 核心线程检查
    → 是:创建新工作线程直接执行该任务
    → 否:尝试将任务加入队列

  3. 队列检查
    → 入队成功:任务进入等待队列
    → 队列已满:检查线程数上限

  4. 最大线程检查
    → 未达上限:创建新线程执行任务
    → 已达上限:执行拒绝策略

工作线程循环:

 

  1. 获取任务

    • 核心线程:workQueue.take()(永久阻塞)

    • 非核心线程:workQueue.poll(keepAliveTime)(超时等待)

  2. 任务执行:调用任务的 run() 方法

  3. 循环处理:执行完成后继续获取新任务

  4. 线程终止:当 getTask() 返回 null 时(超时或线程池关闭)

关键特点可视化:

  1. 三级缓冲机制

    • 第一级:核心线程(快速响应)

    • 第二级:工作队列(缓冲峰值)

    • 第三级:最大线程(应急处理)

  2. 线程回收

    • ⏳ 非核心线程空闲超过 keepAliveTime 后自动回收

    • ♻️ 核心线程默认常驻(除非开启 allowCoreThreadTimeOut

  3. 拒绝策略

    • 🚫 AbortPolicy:抛出异常(默认)

    • 🔙 CallerRunsPolicy:调用者线程执行

    • 🗑️ DiscardPolicy:静默丢弃

    • 🔄 DiscardOldestPolicy:丢弃队首任务后重试

关键点总结:

  1. 核心优先: 优先创建核心线程处理任务(即使有空闲线程也会在核心数不足时创建)。

  2. 队列缓冲: 核心线程满后,新任务进入队列等待。

  3. 应急扩容: 队列满后,才创建非核心线程(上限 maximumPoolSize)处理新提交的任务。

  4. 饱和拒绝: 队列满且线程数已达最大时,触发拒绝策略。

  5. 线程复用: 工作线程通过循环从队列获取任务执行,实现线程复用。

  6. 空闲回收: 非核心线程(及设置了 allowCoreThreadTimeOut 的核心线程)在空闲超过 keepAliveTime 后会被回收,减少资源占用。

  7. 核心常驻: 默认情况下,核心线程即使空闲也会一直存在(除非设置了 allowCoreThreadTimeOut(true))。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值