应选有界队列:容量固定防OOM,触发线程扩容应对突发流量,提供明确背压机制;无界队列虽吞吐高但易致内存耗尽、雪崩风险大,SynchronousQueue适合低延迟场景但需配好拒绝策略。

任务队列是线程池的“缓冲中枢”,它不只存任务,更直接决定线程何时创建、任务何时执行、系统在高负载下会不会卡顿甚至崩溃。选错队列,轻则延迟飙升,重则内存溢出或任务丢失。
有界队列(如 ArrayBlockingQueue):稳住系统,但需防拒绝
容量固定,比如设置为 100,意味着最多缓存 100 个待执行任务。当队列满、且线程数已达最大值时,新任务触发拒绝策略——这是对资源的主动保护。
- 适合 CPU 密集型或对稳定性要求高的服务(如支付核验、风控计算)
- 配合合理的 corePoolSize 和 maximumPoolSize,可避免线程无限膨胀
- 必须搭配明确的拒绝策略,例如 CallerRunsPolicy(让提交线程自己执行)或自定义落盘/发消息队列,防止关键任务丢失
无界队列(如 LinkedBlockingQueue):吞得下,但可能撑爆内存
默认容量为 Integer.MAX_VALUE,看似“永不拒绝”,实则把压力转嫁给了 JVM 堆内存。当任务持续涌入、消费不及,队列无限增长,极易引发 OutOfMemoryError。
- 仅适用于任务量平稳、执行快、且总量可控的场景(如内部定时统计)
- 若必须用,建议显式指定容量上限,而非依赖默认无界行为
- 常见误用:I/O 密集型任务配无界队列 + 小核心线程数 → 队列堆积、响应延迟陡增
SynchronousQueue:零缓冲,追求极致响应
它不存储任务,只做“交接点”:提交任务时,若恰好有空闲线程,立刻交由其执行;否则直接触发线程扩容(只要未达 maximumPoolSize)。
立即学习“Java免费学习笔记(深入)”;
- 适合短平快、低延迟敏感型任务(如 API 网关转发、实时行情分发)
- 要求 maximumPoolSize 设置合理,否则容易因线程创建失败而快速触发拒绝
- 本质是“用线程数换响应速度”,需警惕线程上下文切换开销和 GC 压力
优先级/延迟队列(如 PriorityBlockingQueue、DelayQueue):按需调度,不保 FIFO
任务不再按提交顺序执行,而是依据优先级或延迟时间排序。这对普通业务不适用,但对差异化 SLA 场景很关键。
- PriorityBlockingQueue 可确保告警类任务优先于日志类任务执行
- DelayQueue 适合实现延迟重试、定时清理等逻辑,但需注意任务对象需实现 Delayed 接口
- 注意:它们不是线程安全的“公平队列”,高并发下可能影响调度精度,慎用于强一致性要求场景



















