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); 

他们打印确切的同一时间,似乎他们在相同的时间间隔执行。

尝试添加一个Thread.sleep(1000); 在你的run()方法中调用…基本上,它是基于前一次执行何时结束和何时(逻辑上) 开始调度的区别。

例如,假设我安排一个闹钟以每小时一次的固定速率closures,每次关机时,我都会有一杯咖啡,需要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 

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

显示调用scheduleAtFixedRate方法的时间序列。 如果最后一个执行花费比周期更长的时间,下一个执行将立即开始。 否则,将在一段时间后开始。

调用scheduleAtFixedRate方法的时间序列

调用scheduleWithFixedDelay方法的时间序列。 下一次执行将在一次执行结束和下一次执行之间的延迟时间之后开始,而不pipe执行时间如何

调用scheduleWithFixedDelay方法的时间序列

希望可以帮助你

scheduleAtFixedRate中有一个catch,如果第一个线程花费的时间太长,并且没有在给定的持续时间结束,那么第二个连接线程将不会启动,一旦第一个任务将被完成,并且不会立即开始,而第一个线程已经完成任务和时间已经过去了。 JVM将决定下一个任务何时执行。

我认为这会帮助你select方法,因为这个我得到了很大的问题

如果您阅读Java Doc,则会更清楚

ScheduledFuture scheduleAtFixedRate(Runnable命令,long initialDelay,long period,TimeUnit unit)创build并执行一个周期性的动作,在给定的初始延迟之后首先变为启用状态,然后是给定的周期; 那就是执行会在initialDelay之后开始,然后是initialDelay +周期,然后是initialDelay + 2 *周期,依此类推。

ScheduledFuture scheduleWithFixedDelay(Runnable命令,long initialDelay,long delay,TimeUnit unit)创build并执行一个定期动作,在给定的初始延迟之后首先变为启用状态,随后在一个执行终止和下一个执行终止之间给定延迟。