#scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
- 任务完成之后延时指定时间,再执行下一个任务。
- 如果任务执行过程中发生异常将会终止后续定时任务。
#scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
- 每隔period时间执行一次任务
- 如果指定period内上一个任务没有完成,那么上一个任务完成后立刻执行下一个任务。
- 如果任务执行过程中发生异常将会终止后续定时任务。
对比一下这两个方法发现,其实只有ScheduledThreadPoolExecutor.ScheduledFutureTask#ScheduledFutureTask(java.lang.Runnable, V result, long triggerTime, long period, long sequenceNumber)
中period的值不一样,一个是正数一个是负数。
scheduleWithFixedDelay
是使用当前时间加上延迟时间计算下次任务执行时间.
scheduleAtFixedRate
是使用上次任务执行时间加上延时时间计算下次任务执行时间
ScheduledFutureTask#setNextRunTime