一、如何实现定时执行
关键组件:DelayedWorkQueue、ScheduledFutureTask;
DelayedWorkQueue
Specialized delay queue(延迟队列:是一个无界的BlockingQueue,其中的对象只能在其到期时才能从队列中取走,且队头对象的延迟到期时间最长(heap-based data structure))。
在ScheduledThreadPoolExecutor类中定义,队列中元素类型为ScheduledFutureTask;
ScheduledFutureTask
主要实现run方法,以及辅助延迟队列实现的compareTo(根据执行时间&顺序号排序)、setNextRunTime(FixedRate模式:next_time=本次执行时间+间隔时间;FixedDelay模式:next_time=当前时间+间隔时间;正如两个模式的定义)方法;
run中的主要逻辑:(仅关注周期任务scheduleAtFixedRate/scheduleAtFixedDelay)执行当前任务,若成功,则设置自身下一次执行time,并放入队列;
二、常见问题
1. 在FixedRate模式下,假设每秒触发,如果某次任务执行时间超过间隔时间,后续任务会不会并发执行?
2. 如果任务抛出了异常,后续任务是否继续执行?
通过源码(runAndReset仅在task运行成功返回true),显然本次任务运行没有运行完成时,后续任务不会加入队列,不会并发执行;若任务抛出了异常,runAndReset方法返回false,不满足条件,不会有后续任务加入队列,故后续任务不会执行。