System.currentTimeMillis()方法真的返回当前时间吗?

时间:2009-12-14 17:44:11

标签: java time sleep

基于link中提出的想法,我实施了几种不同的“睡眠方法”。其中一种方法是“二元睡眠”,看起来像这样:

while (System.currentTimeMillis() < nextTimeStamp)
{
sleepTime -= (sleepTime / 2);
sleep(sleepTime);
}

因为检查是否已经到达下一个时间步骤,所以我希望该方法运行时间过长。但模拟误差的累积分布(预期时间 - 实时)如下所示:alt text http://img267.imageshack.us/img267/4224/errorvscummulativearran.jpg

有人知道为什么我会得到这个结果吗?也许方法System.currentTimeMillis()没有真正返回当前时间?

BR,

马库斯

@irreputable

当我进行评估时,我还使用德国统计程序创建了钟形曲线。因为无法更改标题,所以这里是所有相关项目的英文翻译:

Häufigkeit=频率

Fehler =错误

Mittelwert =平均值

Std-Abw =标准差

alt text http://img694.imageshack.us/img694/2254/bellcurve.jpg

3 个答案:

答案 0 :(得分:10)

不,不。它的弟弟System#nanoTime()System#currentTimeMillis()有更好的精确度

除了他们的Javadocs中的答案(点击上面的链接),这个主题也在这里讨论过几次。在"currenttimemillis vs nanotime"上进行搜索,您将了解每个主题:System.currentTimeMillis vs System.nanoTime

答案 1 :(得分:2)

根据文档,

 * Returns the current time in milliseconds.  Note that
 * while the unit of time of the return value is a millisecond,
 * the granularity of the value depends on the underlying
 * operating system and may be larger.  For example, many
 * operating systems measure time in units of tens of
 * milliseconds.

答案 2 :(得分:2)

您所看到的是基础时钟分辨率达到15ms。这是OS&amp; amp;的一个特征。中断率。有一个Linux内核的补丁,将此分辨率提高到1毫秒,我不确定Windows。已经有很多posts了。