ScheduledExecutorService定时任务停止问题

文章介绍了ScheduledExecutorService的scheduleAtFixedRate方法在遇到异常时如何抑制后续任务的执行。通过两个本地验证示例,展示了不捕获异常时任务会被抑制,而捕获异常(特别是使用Throwable)可以避免这种情况,允许任务继续执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

最近开市场问题,发现程序中同时开启的四个定时任务只有一个还在执行,后面跟踪原因,发现是ScheduledExecutorService在遇到异常时候会抑制后续任务的执行。


一、ScheduledExecutorService#scheduleAtFixedRate方法注释

在这里插入图片描述
后半段主要说明以下三点:

  1. 如果某一次过程中产生异常,则会抑制后续任务的执行
  2. 正常情况下,该定时任务只会通过取消和终止执行者停止
  3. 如果一次任务的实际执行时间比方法中给定的周期还长,那么下次任务会等该次任务执行结束后再开始,且保证不会并发执行

二、本地验证

1.不捕获异常

代码如下(示例):

public static void main11() {
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
    LongAdder longAdder = new LongAdder();
    scheduledExecutorService.scheduleAtFixedRate(() -> {
        longAdder.add(1L);
        System.out.println(longAdder.longValue() + " 次任务开始执行");
        if (longAdder.longValue() >= 3) {
            System.err.println(longAdder.longValue() + " 次任务执行过程中抛出异常");
            System.err.println("异常" + 1 / 0);
        }
    }, 1, 1, TimeUnit.MILLISECONDS);
}

运行结果:
在这里插入图片描述
任务还在继续运行,但是后续的执行因为异常的产生被抑制。

2.捕获异常(注意使用Throwable)

代码如下(示例):

public static void main12() {
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
    LongAdder longAdder = new LongAdder();
    scheduledExecutorService.scheduleAtFixedRate(() -> {
        longAdder.add(1L);
        System.out.println(longAdder.longValue() + " 次任务开始执行");
        if (longAdder.longValue() >= 3) {
            // 增加了try-catch,注意这里最好使用Throwable,防止漏掉Error
            try {
                System.err.println("构造异常" + 1 / 0);
            } catch (Throwable e) {
                System.err.println(longAdder.longValue() + " 次任务执行过程中抛出异常" + e.getMessage());
            }
        }
    }, 1, 1, TimeUnit.MILLISECONDS);
}

运行结果:
在这里插入图片描述
手动停止进程后,进行截图,如果不手动停止该任务一直运行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值