一个关于定时任务的需求

108 阅读1分钟

一个关于定时任务的需求

遇到了一个情况,凌晨的时候排队模块挂掉且再起不能,老大八点钟手动重启。一直用的是TimerTask,因为timer类的内部是单线程的,所以即使catch了异常,也可能没法自己继续执行定时任务。因此这里改为使用ScheduledExecutorService,实现这个定时任务。具体的分析可以看这篇文章定时任务最简单的3种实现方法

在当前的业务场景里面只需要一个单线程的ScheduledExecutorService:

static ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

如果出现异常,那么当前的线程会被挂起,且不会打印错误信息。测试代码如下:

AtomicInteger c= new AtomicInteger(3);  
executorService.scheduleWithFixedDelay(()->{  
  System.out.println(3/c.decrementAndGet());  
}, 0, 1, TimeUnit.SECONDS);

当除到0的时候,线程直接挂起,不再继续进行定时任务。用try/catch进行异常处理即可解决。