关于a 和a 之间的差异,这个高度投票的答案在列举差异时提到了以下内容:TimerScheduledThreadPoolExecutor
定时器可以对系统时钟的变化敏感,而ScheduledThreadPoolExecutor则不然.
以上是在Java Concurrency in Practice这本伟大的书中逐字提到的.
除了上面提到的那个,我理解那个答案中提到的要点.说什么Timers对系统时钟敏感而ScheduledThreadPoolExecutors不是?
Timer用途System.currentTimeMillis(),表示挂钟时间,不应用于检查相对时间,例如确定运行的时间,或者在这种情况下,在执行任务之前延迟多长时间.System.currentTimeMillis()受自动调整系统时钟或甚至手动更改系统时钟等因素的影响.因此,如果你打电话两次并检查你得到的时间之间的差异,你甚至可以得到一个负数.
System.nanoTime()另一方面,它专门用于测量经过的时间,应该用于此类事情.
Timer 使用 System.currentTimeMillis()确定下一次执行任务.
然而ScheduledThreadPoolExecutor用途System.nanoTime().
此外,nanoTime()方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.
System.currentTimeMillis()对系统时钟很敏感
System.nanoTime()是不敏感的系统时钟,因为它测量经过的时间.
Java文档: System.nanoTime()
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.返回的值表示纳秒,因为某些固定但是任意时间(可能在将来,因此值可能为负).
| 归档时间: |
|
| 查看次数: |
3677 次 |
| 最近记录: |