REJAVA / LEARNING NOTES
线程池:先判断任务去哪
随时回查术语、规则和示例;完整解释见对应课程。
根据课程材料整理
本次更新说明
- 补充术语中文释义。
- 整理为公开学习笔记,保留技术内容与练习。
- 清理个人分析,完善阅读导航。
正常运行下的接纳顺序
不足核心数:建线程 → 否则 → 入队 → 失败 → 不足最大数:扩容 → 失败 → 拒绝
判断工作线程数量,不是忙碌线程数量。入队使用 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(执行器服务接口)。本表用于复习,第一次学习请读完整课程。