ScheduledExecutorService的坑

参考文献

调度服务 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();抛出任何异常就会导致任务卡住。

ScheduledExecutorService的坑_第1张图片

优化后代码

/**
 * 样例代码
*/
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);
    }

你可能感兴趣的:(好记性不如记事本,java,Scheduled,java定时任务)