任务队列起作用的明确时机是:当核心线程全部忙碌且当前线程数≥corepoolsize时,新任务立即入队等待;若队列已满且线程数<maximumpoolsize,则创建非核心线程执行任务。

任务队列在提交任务时,**当核心线程全部忙碌、且新任务无法立即由空闲线程处理时,立刻起作用**。
任务队列起作用的明确时机
线程池接收任务后,按固定顺序判断执行路径:
- 若当前线程数
- 若当前线程数 ≥ corePoolSize,且所有核心线程都在运行 → 新任务立即进入任务队列,等待被取出执行
- 若队列已满(有界队列)且线程数
无界队列下的特殊表现
使用 LinkedBlockingQueue(无参构造)时,队列容量为 Integer.MAX_VALUE,几乎不会“满”:
- 只要 corePoolSize 设置合理,后续所有任务都直接入队
- maximumPoolSize 和 keepAliveTime 实际失效,线程数永远维持在 corePoolSize
- 看似吞吐高,但可能因积压导致 OOM 或响应延迟,需谨慎评估业务场景
队列是否真的“缓冲”,取决于线程消费速度
队列不是被动容器,而是生产者-消费者模型中的关键协调点:
- 核心线程从队列中 take() 任务,执行完再取下一个
- 如果任务执行慢、或队列过大,任务可能长时间滞留,造成实际延迟
- 队列长度持续增长,往往是线程池配置不合理或下游处理瓶颈的信号
拒绝策略触发前,队列是最后一道缓冲
只有当以下条件同时满足,队列才“失守”,触发拒绝策略:
- 队列已满(对有界队列而言)
- 当前线程数已达 maximumPoolSize
- 再提交新任务 → 不入队、不扩容,直接交给 handler 处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











