← ReJava · 学习目录

REJAVA / LEARNING NOTES

线程池:先判断任务去哪

随时回查术语、规则和示例;完整解释见对应课程。

Java 17 / 21更新于 2026.10.04约 4 分钟阅读

根据课程材料整理

本次更新说明
  • 补充术语中文释义。
  • 整理为公开学习笔记,保留技术内容与练习。
  • 清理个人分析,完善阅读导航。

正常运行下的接纳顺序

不足核心数:建线程 → 否则 → 入队 → 失败 → 不足最大数:扩容 → 失败 → 拒绝

判断工作线程数量,不是忙碌线程数量。入队使用 offer(尝试放入方法),不一直等待空位;入队后还会复查关闭状态和工作线程是否存在。

例: 核心 2、最大 4、队列 2、AbortPolicy(抛异常拒绝策略),任务都未结束:1/2 新建线程;3/4 排队;5/6 扩容直接执行;7 被拒绝。整个池不保证任务按提交顺序开始或结束。

依据:官方摘录 A–C;实验记录(本地资料)。

7 个参数,分四组

数量: corePoolSize(核心线程数)、maximumPoolSize(最大线程数)。

空闲回收: keepAliveTime(空闲回收时间)、unit(时间单位)。默认只回收超过核心数量的空闲线程;不限制任务运行时间。

排队: workQueue(任务队列)。

创建与拒绝: threadFactory(线程工厂)、handler(拒绝处理器)。

核心线程默认按需创建,可预启动;允许核心线程超时需要显式开启并设置正的空闲时间。

依据:官方摘录 A、B。

队列决定什么时候扩容

有界队列: 例如 ArrayBlockingQueue(数组阻塞队列),新任务入队失败才尝试扩容;容量也影响延迟和内存。

不指定容量的 LinkedBlockingQueue(链式阻塞队列): 容量为 Integer.MAX_VALUE(整数类型最大值),通常先大量积压,最大线程数通常不起扩容作用。

SynchronousQueue(同步移交队列): 不存任务,直接交接;交接失败再尝试增线程或拒绝。

Fixed/Single 的工厂默认队列近似无界;Cached 的线程数上限极大。选用前检查容量约束。

依据:官方摘录 A、H、L。

4 种拒绝策略

AbortPolicy(抛异常拒绝策略): 抛出 RejectedExecutionException(任务被拒绝异常),默认行为。

CallerRunsPolicy(调用者执行策略): 未关闭时由提交者执行,已关闭则丢弃。可能占住请求线程。

DiscardPolicy(丢弃当前任务策略): 丢本次任务。

DiscardOldestPolicy(丢弃队头任务策略): 未关闭时丢队头再重试;已关闭则丢弃。

拒绝也可能因为关闭。内存线程池不提供持久化;丢弃与 Future(异步结果句柄) 的失败反馈要主动设计。

依据:官方摘录 A、D、I。

提交、结果与异常

execute(执行提交方法): 不返回结果句柄;提交处不能自动捕获另一个工作线程后来抛出的异常。

submit(提交并返回结果句柄的方法): 返回 Future(异步结果句柄)。任务异常通常由 Future.get(获取结果方法) 抛出 ExecutionException(任务执行异常),再查 cause。

Future.get(获取结果方法) 可以等待;带超时的 Future.get(获取结果方法) 超时不自动取消任务。两种提交入口都可能当场被 AbortPolicy(抛异常拒绝策略) 拒绝。

可见性: 提交前动作 → 任务动作 → Future.get(获取结果方法) 取得结果后的动作,建立 happens-before(先行发生关系);不涵盖提交后任意共享修改。

依据:官方摘录 E、G、I–K。

参数配置的回答顺序

① 看任务到达量及 CPU(处理器)/等待时间。
② 看数据库连接、接口限额等下游约束。
③ 按排队预算和内存选择队列。
④ 明确拒绝、失败与恢复方式。
⑤ 压测完成量、等待时间、拒绝率,再调整。

平均忙碌线程需求可粗估为“每秒任务数 × 平均占用线程秒数”。它不包含波动余量,也不是最优线程数公式。

基于官方摘录 A 的资源权衡推导;数值必须结合实测。

关闭时必须区分

shutdown(有序关闭): 不再接收,处理已提交任务;调用本身不等待完成。

shutdownNow(尝试立即关闭): 返回未开始任务,尝试中断正在运行的任务;不是强杀。

awaitTermination(限时等待终止的方法): 限时等待终止,不主动发起关闭。

流程:有序关闭 → 限时等待 → 必要时尝试中断 → 再确认终止。对未执行任务安排失败反馈或恢复。

依据:官方摘录 E、F;完整清理示例见 Demo。

本课收束: 一次应用判断与一次完整表达后集中反馈。能回答、能追问、结合业务说明选择分别记录;独立实现与隔日保持另记,未做实验不否定已经证明的理解。现行验收说明 · 可选深化实验 · 隔日复测

主来源:JDK 21 ThreadPoolExecutor(线程池执行器) 与 ExecutorService(执行器服务接口)。本表用于复习,第一次学习请读完整课程。