先看ScheduledExecutorService类的scheduleAtFixedRate()和scheduleWithFixedDelay()的方法签名。
scheduleAtFixedRate
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
scheduleWithFixedDelay
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
主要区别在第三个参数:
- scheduleAtFixedRate的参数是period,它是以任务的开始时间计时,period时间过去后,如果任务已经执行完成,立即执行下一个任务。如果任务没有执行完,则需要等任务执行完毕后才能立即执行下一个任务。也就是说不会并行执行任务。
- scheduleWithFixedDelay的参数是delay,是以任务结束时开始计时(计算延时),delay时间过去后,立即执行下一个任务。不会出现并行执行任务。
scheduleAtFixedRate执行任务图
scheduleWithFixedDelay执行任务图
图来自:https://blog.csdn.net/jianghuiyun/article/details/96151861