ScheduledExecutorService的坑

文章讲述了在使用ScheduledExecutorService定时任务时遇到卡顿的问题,原因在于任务执行异常会抑制后续任务。通过捕获并处理异常,避免了任务阻塞。优化后的代码增加了异常捕捉,保证了服务的稳定运行。
摘要由CSDN通过智能技术生成

参考文献

调度服务 ScheduledExecutorService 经常卡顿问题的排查及解决方法-腾讯云开发者社区-腾讯云

场景

        一个安顿广播程序使用的ScheduledExecutorService来定时执行任务,当有一个任务出现异常后就会卡住,不会继续执行后续的任务。

解决方案

查找定时运行的代码,捕获异常,当遇到错误时不影响后续任务执行。

/**
 * 样例代码
*/
private final ScheduledExecutorService es = Executors.newScheduledThreadPool(1);

public void execute(AndonCallService andonCallService) {
        //10ms执行一次
        es.scheduleWithFixedDelay(() -> {
            andonCallService.andonCall();
        }, 0, 100, TimeUnit.MILLISECONDS);
    }

查看上面样例中使用的scheduleWithFixedDelay方法

源码注释中有这么一句:If any execution of the task encounters an exception, subsequent executions are suppressed.

翻译过来的意思就是:如果任务的任何执行遇到异常,则会抑制后续执行。

所以如果样例代码中andonCallService.andonCall();抛出任何异常就会导致任务卡住。

优化后代码

/**
 * 样例代码
*/
private final ScheduledExecutorService es = Executors.newScheduledThreadPool(1);

public void execute(AndonCallService andonCallService) {
        //10ms执行一次
        es.scheduleWithFixedDelay(() -> {
            try{//新增异常处理
                andonCallService.andonCall();
            }catch (Exception e){
                log.error("执行调度任务发生异常,忽略此任务:{}", e.getMessage());
            }
        }, 0, 100, TimeUnit.MILLISECONDS);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值