本文主要是介绍ScheduledExecutorService scheduleAtFixedRate抛出异常后定时任务不会再执行源码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ScheduledExecutorService有时会被用来实现本地的定期任务执行,常规使用方式如下所示:
scheduledExecutorService.scheduleAtFixedRate(() -> {System.out.println("执行调度");Integer a = null;a.toString();System.out.println("调度结束");}, 0, 1, TimeUnit.SECONDS);
但是需要注意的是如果上面的执行任务抛出异常后,后面的定时任务就不会再执行了,所以在使用 ScheduledExecutorService进行定时任务处理时,一定要对可能出现的异常进行捕获,下面分析下为什么会出现上面的原因。
下面看下核心代码ScheduledThreadPoolExecutor$.ScheduledFutureTask:
看下该类的run方法
public void run() {if (!canRunInCurrentRunState(this))cancel(false);else if (!isPeriodic())super.run();else if (super.runAndReset()) {// 任务方法抛出异常时runAndReset返回false,下面的方法都不执行,这就是为什么定时任务抛出异常后定时任务不再执行的原因setNextRunTime();reExecutePeriodic(outerTask);} }
这篇关于ScheduledExecutorService scheduleAtFixedRate抛出异常后定时任务不会再执行源码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!