首页 > Java > java教程 > 正文

java线程池有哪些拒绝策略

冷炫風刃
发布: 2025-12-04 13:40:41
原创
470人浏览过
Java线程池内置4种拒绝策略:1. AbortPolicy默认抛异常;2. CallerRunsPolicy由调用方执行任务以降速;3. DiscardPolicy静默丢弃;4. DiscardOldestPolicy丢弃队列中最老任务。

java线程池有哪些拒绝策略

Java线程池有4种内置拒绝策略,都实现在 `ThreadPoolExecutor` 类中,通过 `RejectedExecutionHandler` 接口定义。它们在任务无法被接纳(线程数已达最大、队列已满、线程池已关闭)时触发。

AbortPolicy(中止策略)

这是线程池的默认策略。当任务被拒绝时,直接抛出 RejectedExecutionException 异常。

适用场景:对任务失败敏感、需要立即感知并处理异常的系统,比如支付、订单创建等关键链路。

  • 不丢任务但会中断调用方流程
  • 必须配合 try-catch 或全局异常处理器使用,否则可能 crash
  • 适合强一致性、低容忍丢失的业务

CallerRunsPolicy(调用方运行策略)

由提交任务的线程(比如主线程、Web容器线程)自己执行该任务。

效果是“降速”:当线程池压力大时,调用方被拖慢,自然降低任务提交速率,避免雪崩。

立即学习Java免费学习笔记(深入)”;

SuperDesign
SuperDesign

开源的UI设计AI智能体

SuperDesign 216
查看详情 SuperDesign
  • 不会丢任务,也不抛异常
  • 可能阻塞调用线程,影响吞吐量和响应时间
  • 适合允许延迟、不能丢任务、并发量可控的后台服务

DiscardPolicy(丢弃策略)

静默丢弃新提交的任务,既不抛异常,也不做任何日志或通知。

风险高,容易掩盖问题,一般不建议直接使用。

  • 完全无感知,调试困难
  • 仅适用于日志采集、埋点上报等可丢失、非关键任务
  • 生产环境慎用,最好配合监控告警自定义实现

DiscardOldestPolicy(弃老策略)

丢弃队列中等待时间最长的那一个任务,再尝试把当前新任务加入队列。

本质是“用旧换新”,适合新任务时效性远高于旧任务的场景。

  • 仍可能丢任务,但优先保障最新请求
  • 要求队列是非公平的(如 LinkedBlockingQueue),否则可能丢错
  • 常见于实时消息推送、状态同步等对新鲜度敏感的业务
基本上就这些。四种策略覆盖了抛异常、降速、静默丢弃、替换丢弃等典型应对方式。实际项目中,更推荐基于 `RejectedExecutionHandler` 自定义策略——比如记录日志 + 上报 Prometheus + 触发熔断,让拒绝行为可观测、可追踪、可响应。

以上就是java线程池有哪些拒绝策略的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号