在 Java 的并发编程中,ExecutorService 的拒绝策略(Rejection Policy)指的是:
当线程池无法接收新提交的任务时,所采取的处理方式。
当满足以下所有条件时,线程池会拒绝新任务:
maximumPoolSize此时再提交任务,就会触发 RejectedExecutionHandler。
Java 在 ThreadPoolExecutor 中提供了 4 种常见策略:
new ThreadPoolExecutor.AbortPolicy()
RejectedExecutionException✅ 最常用、最安全(不会丢任务,但会报错)
new ThreadPoolExecutor.CallerRunsPolicy()
✅ 适合:不能丢任务、希望平滑降级
new ThreadPoolExecutor.DiscardPolicy()
⚠️ 风险:任务悄悄丢失,难以排查
new ThreadPoolExecutor.DiscardOldestPolicy()
⚠️ 可能丢失重要任务,需谨慎使用
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2,
4,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(10),
new ThreadPoolExecutor.CallerRunsPolicy()
);
你可以实现 RejectedExecutionHandler:
executor.setRejectedExecutionHandler((r, executor1) -> {
// 记录日志 / 落库 / 报警
log.error("任务被拒绝: {}", r);
});
✅ 常见做法:
| 场景 | 推荐策略 |
|---|---|
| 普通业务,快速失败 | AbortPolicy |
| 不能丢任务 | CallerRunsPolicy |
| 可丢非核心任务 | DiscardPolicy |
| 实时性要求高 | DiscardOldestPolicy |
| 生产环境 | 自定义(日志 + 报警) |
如果你愿意,我也可以结合 线程池参数设置、真实业务场景或源码层面 再深入讲一讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。