9

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

Timer 可以对系统时钟的变化敏感,而 ScheduledThreadPoolExecutor 则不是。

上面的内容是在伟大的 Java Concurrency in Practice 一书中逐字提到的。

我理解该答案中提到的要点,但上述要点除外。说Timers对系统时钟敏感而对系统时钟ScheduledThreadPoolExecutors不敏感是什么意思?

4

3 回答 3

10

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

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

于 2013-09-14T16:19:59.833 回答
5

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

然而ScheduledThreadPoolExecutor使用System.nanoTime().

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

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

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

Java 文档:System.nanoTime()

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

于 2013-09-14T16:17:38.310 回答
1

查看源代码,该Timer课程使用System.currentTimeMillis(). ScheduledThreadPoolExecutor用途System.nanoTime()。 _

currentTimeMillis()将倾向于使用操作系统时钟,即跟踪当前日期/时间的时钟。nanoTime()将倾向于使用更高分辨率的硬件时钟。

如果您将操作系统时钟向后移动一个小时,那么currentTimeMillis()应该可以反映出这一点,而不nanoTime()应该。

于 2013-09-14T16:33:56.457 回答