温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

什么是ExecutorService拒绝策略

发布时间:2026-10-27 11:10:51 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 的并发编程中,ExecutorService 的拒绝策略(Rejection Policy)指的是:
当线程池
无法接收新提交的任务
时,所采取的处理方式。


一、什么时候会触发拒绝策略?

当满足以下所有条件时,线程池会拒绝新任务:

  1. 线程池已经 shutdown(关闭)
  2. 或线程池中的:
    • 线程数已达 maximumPoolSize
    • 且 工作队列(BlockingQueue)已满

此时再提交任务,就会触发 RejectedExecutionHandler。


二、JDK 提供的 4 种内置拒绝策略

Java 在 ThreadPoolExecutor 中提供了 4 种常见策略:

1️⃣ AbortPolicy(默认)

new ThreadPoolExecutor.AbortPolicy()
  • 直接抛出异常
  • 异常类型:RejectedExecutionException
  • 适合:希望快速失败、及时发现问题

✅ 最常用、最安全(不会丢任务,但会报错)


2️⃣ CallerRunsPolicy

new ThreadPoolExecutor.CallerRunsPolicy()
  • 由提交任务的线程自己执行该任务
  • 不会丢弃任务,也不会抛异常
  • 会降低提交速度,起到天然限流作用

✅ 适合:不能丢任务、希望平滑降级


3️⃣ DiscardPolicy

new ThreadPoolExecutor.DiscardPolicy()
  • 直接丢弃任务
  • 不做任何处理,也不抛异常

⚠️ 风险:任务悄悄丢失,难以排查


4️⃣ DiscardOldestPolicy

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);
});

✅ 常见做法:

  • 记录日志
  • 任务持久化(如 MQ、Redis)
  • 报警通知

五、如何选择拒绝策略?

场景 推荐策略
普通业务,快速失败 AbortPolicy
不能丢任务 CallerRunsPolicy
可丢非核心任务 DiscardPolicy
实时性要求高 DiscardOldestPolicy
生产环境 自定义(日志 + 报警)

如果你愿意,我也可以结合 线程池参数设置、真实业务场景或源码层面 再深入讲一讲。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手