DiscardPolicy 的“默默丢弃”指线程池在活跃线程达 maximumPoolSize、队列已满且未关闭时,直接忽略新任务,不执行、不抛异常、不记录日志;适用于允许丢失的非关键场景。

DiscardPolicy 的“默默丢弃”是指:当线程池无法接纳新任务(即核心线程忙、队列已满、最大线程也已达上限)时,该策略不做任何日志、不抛异常、不重试、也不执行任务本身,直接忽略传入的 Runnable 任务。
DiscardPolicy 的核心行为
它实现了 RejectedExecutionHandler 接口,其 rejectedExecution 方法体为空:
- 不调用
r.run() - 不抛出
RejectedExecutionException - 不操作队列(如
poll()或offer()) - 不记录日志,也不触发任何回调或监控上报
什么时候会触发 DiscardPolicy
必须同时满足以下三个条件:
- 当前活跃线程数已达
maximumPoolSize - 工作队列(如
ArrayBlockingQueue)已满 - 线程池未关闭(
!e.isShutdown())
只有这时,新提交的任务才会被交给拒绝策略处理;DiscardPolicy 就是“收下又扔掉”,连打印一句“我不要了”都没有。
实际效果示例
假设配置为:
new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue(1),
new ThreadPoolExecutor.DiscardPolicy())连续提交 3 个任务:
- 第 1 个:立即由唯一线程执行
- 第 2 个:进入队列等待
- 第 3 个:线程忙 + 队列满 + 无扩容空间 → 触发 DiscardPolicy → 彻底消失,无输出、无异常、无痕迹
使用 DiscardPolicy 的注意事项
它适合对任务丢失不敏感的场景,但需确保:
- 业务允许丢失(例如:非关键埋点、降级后的健康检测任务)
- 上游有重试机制或幂等保障(否则丢一次就永远没了)
- 监控体系能捕获“任务提交量 > 实际执行量”的差值(靠外部指标发现丢弃)
切勿在支付、订单创建等强一致性场景中直接使用 DiscardPolicy。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











