schedule和scheduleAtFixedRate有什么区别?

sap*_*Pro 27 java

这两种方法有什么区别Timer:

schedule(TimerTask task, long delay, long period)
Run Code Online (Sandbox Code Playgroud)

scheduleAtFixedRate(TimerTask task, long delay, long period)
Run Code Online (Sandbox Code Playgroud)

文档没有明确区别.

JB *_*zet 47

文档确实解释了区别:

时间表:

在固定延迟执行中,每次执行都是相对于上一次执行的实际执行时间进行调度的.如果执行因任何原因(例如垃圾收集或其他后台活动)而延迟,则后续执行也将延迟.

所以,假设延迟是5秒,每个任务需要2秒,你会得到

TTWWWTTWWWTTWWWTT
Run Code Online (Sandbox Code Playgroud)

其中T1表示任务执行,W意味着1秒等待.

但现在假设一个长GC(由a表示G)发生并延迟第二个任务,第三个任务将在第二个任务开始后5秒开始,就像长GC没有发生一样:

TTWWWGGTTWWWTTWWWTT
Run Code Online (Sandbox Code Playgroud)

第三个任务在第二个任务开始后5秒开始.

scheduleAtFixedRate:

在固定速率执行中,每次执行都是相对于初始执行的预定执行时间进行调度的.如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则会快速连续执行两次或更多次执行以"赶上".

因此,与上面相同的延迟和相同的GC,你会得到

TTWWWGGTTWTTWWWTT
Run Code Online (Sandbox Code Playgroud)

第三个任务任务在第二个任务任务开始后3秒而不是5秒,以赶上.