本文主要是介绍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();抛出任何异常就会导致任务卡住。
优化后代码
/*** 样例代码
*/
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);}
这篇关于ScheduledExecutorService的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!