scheduleAtFixedRate vs scheduleWithFixedDelay

Saw*_*yer 105 java scheduled-tasks scheduledexecutorservice

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);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 180

尝试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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

你想要哪一个取决于你的任务.

  • 如果制作咖啡需要一个多小时,在fixedRate场景中会发生什么? (14认同)
  • @BrettVanderVeen:我认为这取决于有问题的执行者.它将按时*进行调度 - 但是*执行*是否取决于该执行程序是否可以使用该线程.我建议您尝试在各种情况下查看其工作原理. (5认同)
  • @BrettVanderVeen来自[文档](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate-java.lang.Runnable-long-long-java. util.concurrent.TimeUnit-),"如果此任务的任何执行时间超过其周期,则后续执行可能会延迟,但不会同时执行." 换句话说,一致的实现将不允许下一个执行直到前一个完成. (5认同)

Ken*_*ock 49

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

调度scheduleAtFixedRate方法的时间序列

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

时间序列的调用scheduleWithFixedDelay方法

希望可以帮到你


小智 8

scheduleAtFixedRate()方法会创建一个新任务,并在每个周期将其提交给执行器,而不管上一个任务是否完成

另一方面,该scheduleWithFixedDelay()方法在前一个任务完成后创建一个新任务。


sha*_*zin 5

如果你读一下Java Doc就会更清楚

ScheduledFuture ScheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 创建并执行一个周期性操作,该操作首先在给定的初始延迟之后启用,然后在给定的周期内启用;也就是说,执行将在initialDelay之后开始,然后是initialDelay+period,然后是initialDelay + 2 * period,依此类推。

ScheduledFuture ScheduleWithFixedDelay(Runnable command, longinitialDelay, longdelay, TimeUnitunit) 创建并执行一个周期性操作,该操作在给定的初始延迟之后首先启用,然后在一个执行终止和下一个执行开始之间具有给定的延迟。