繁体   English   中英

System.currentTimeMillis()(Java)错误的时间

[英]Wrong Time with System.currentTimeMillis () (Java)

我做了一个小程序来测试System.currentTimeMillis()。 我有一个奇怪的结果。 这是我的日志:

1    26-12-09 20:48:21 - [Log] lTime = 1261860501009
2    26-12-09 20:48:21 - [Log] lTime = 1261860501012
3    26-12-09 20:48:21 - [Log] lTime = 1261864899078
4    26-12-09 20:48:21 - [Log] lTime = 1261860501033
5    26-12-09 20:48:21 - [Log] lTime = 1261860501069

如您所见,第3行存在问题。时间磨损是错误的。 它应该在1261860501012和1261860501033之间。大约有73毫秒的误差。

有人知道问题来自哪里?

非常感谢

bill0ute

编辑:操作系统:Debian 4.0,Java:6_17。

我的代码:

while (true) 
    setLog (System.currentTimeMillis ());

编辑:程序在基于Linux的VPS上运行

System.currentTimeMillis()依赖于系统时钟。 看起来系统时钟已被外部程序微调,对于可能是NTP的 Linux。

请注意,您不应使用System.currentTimeMillis()来测量已用时间。 最好使用System.nanoTime()但即使这样也不能保证是单调的。

首先,你有一个小错字,它是73毫秒,而不是秒(那将是令人不安的:-))。

为了达到这一点,您应该知道Java是一种非常高级的语言,只能访问通过本机函数调用提供给您的系统函数。 这些调用是由您的虚拟机实现的,并且有很多(Sun,Open,Dalvik ..),所以不能给出一般建议,但返回时间currentTimeMillis取决于许多东西,如线程(在VM和本机线程中),板载计时器等的分辨率。我承认结果很奇怪,但除非你高度依赖于他们的正确顺序,否则我不会打扰而只是生活在异常中十分之一秒的范围。

如果您需要更具体的建议,请粘贴一些源代码!

编辑:

在看过您的源代码之后,我非常确定您的Log函数使用某种优先级处理或线程,这会导致错误的结果。 只是尝试分配有问题的方法的返回值,并将该变量传递给您的日志:

long foo = System.currentTimeMillis();
setLog(foo); 

我们曾经看过类似的东西,在Ubuntu上运行AMD64x2芯片。 如果你还有芯片,我会开始寻找。

有问题的方法取决于系统时钟,系统时钟可能有问题。 有关通过ntpd(8)守护程序保持系统时钟准确的问题的讨论,请参见http://support.ntp.org/bin/view/Support/KnownOsIssues

我还建议http://www.vmware.com/pdf/vmware_timekeeping.pdf讨论VMWare中系统时钟的准确性。 它对系统时钟的讨论也很普遍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM