Java中的Timer类如何对系统时钟敏感?

Gee*_*eek 8 java timer

关于a 和a 之间的差异,这个高度投票的答案在列举差异时提到了以下内容:TimerScheduledThreadPoolExecutor

定时器可以对系统时钟的变化敏感,而ScheduledThreadPoolExecutor则不然.

以上是在Java Concurrency in Practice这本伟大的书中逐字提到的.

除了上面提到的那个,我理解那个答案中提到的要点.说什么Timers对系统时钟敏感而ScheduledThreadPoolExecutors不是?

Col*_*inD 9

Timer用途System.currentTimeMillis(),表示挂钟时间,不应用于检查相对时间,例如确定运行的时间,或者在这种情况下,在执行任务之前延迟多长时间.System.currentTimeMillis()受自动调整系统时钟或甚至手动更改系统时钟等因素的影响.因此,如果你打电话两次并检查你得到的时间之间的差异,你甚至可以得到一个负数.

System.nanoTime()另一方面,它专门用于测量经过的时间,应该用于此类事情.


Nar*_*hai 5

Timer 使用 System.currentTimeMillis()确定下一次执行任务.

然而ScheduledThreadPoolExecutor用途System.nanoTime().

此外,nanoTime()方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.

System.currentTimeMillis()系统时钟很敏感

System.nanoTime()不敏感的系统时钟,因为它测量经过的时间.

Java文档: System.nanoTime()

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.返回的值表示纳秒,因为某些固定但是任意时间(可能在将来,因此值可能为负).