我的一个朋友向我展示了他所做的一些事情,我很难解释这是怎么发生的:他正在使用 System.nanotime 来计时,它每秒钟都会给用户一个更新来告诉用户有多少时间已经过去了(这部分是 Thread.sleep(1000) ),而且似乎很长时间(等待 10 秒的东西大约需要 3 分钟才能完成)。我们尝试使用毫秒来查看经过了多少时间:它打印出每秒经过了多少纳米时间,我们看到每一秒,纳米时间每秒移动大约 40-50 毫秒。
我检查了与 System.nanotime 和 Java 相关的错误,但似乎我能找到的唯一事情涉及 nanotime 突然大幅增加然后停止。我还根据我在另一个问题中阅读的内容浏览了此博客条目,但没有任何可能导致它的内容。
显然,这可以通过只使用毫秒来解决这种情况;有很多解决方法,但我很好奇的是,除了系统时钟的硬件问题或至少 CPU 拥有的最准确时钟之外是否还有其他问题(因为这就是 System.nanotime 似乎使用的)这可能会导致它像这样一直缓慢运行?
long initialNano = System.nanoTime();
long initialMili = System.currentTimeMillis();
//Obviously the code isn't actually doing a while(true),
//but it illustrates the point
while(true) {
Thread.sleep(1000);
long currentNano = System.nanoTime();
long currentMili = System.currentTimeMillis();
double secondsNano = ((double) (currentNano - initialNano))/1000000000D;
double secondsMili = ((double) (currentMili - initialMili))/1000D;
System.out.println(secondsNano);
System.out.println(secondsMili);
}
secondsNano 会打印出 0.04 的数值,而 secondsMili 会打印出非常接近 1 的数值。
看起来Sun 的错误数据库中已经报告了沿着这条线的错误,但他们将其作为副本关闭,但他们的链接没有指向现有错误。它似乎是特定于系统的,所以我越来越确定这是一个硬件问题。