scheduleAtFixedRate vs scheduleWithFixedDelay

ScheduledExecutorService 和方法之间的主要区别是什么?scheduleAtFixedRatescheduleWithFixedDelay

scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleAtFixedRate:    " + new Date());
    }
}, 1, 3L , SECONDS);

scheduler.scheduleWithFixedDelay(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleWithFixedDelay: " + new Date());
    }
}, 1, 3L , SECONDS);

它们完全相同的时间打印,似乎它们以完全相同的时间间隔执行。


答案 1

尝试在方法中添加调用...基本上,这是根据上一次执行结束的时间和(逻辑上)开始的时间来调度某些东西之间的区别。Thread.sleep(1000);run()

例如,假设我安排一个闹钟以每小时一次的固定速率响起,每次闹钟响起时,我都会喝杯咖啡,这需要10分钟。假设从午夜开始,我会有:

00:00: Start making coffee
00:10: Finish making coffee
01:00: Start making coffee
01:10: Finish making coffee
02:00: Start making coffee
02:10: Finish making coffee

如果我安排一个小时的固定延迟,我会有:

00:00: Start making coffee
00:10: Finish making coffee
01:10: Start making coffee
01:20: Finish making coffee
02:20: Start making coffee
02:30: Finish making coffee

您想要哪一个取决于您的任务。


答案 2

可视化调用方法的时间序列。如果最后一次执行花费的时间超过周期,则下一次执行将立即开始。否则,它将在一段时间后开始。scheduleAtFixedRate

time series of invocation scheduleAtFixedRate method

调用方法的时间序列。下一次执行将在一次执行终止和下一次执行开始之间的延迟时间之后开始,无论其执行时间如何scheduleWithFixedDelay

time series of invocation scheduleWithFixedDelay method

希望能帮到你


推荐