Java Object.wait(long,long)与Documentation不同的实现

时间:2015-04-10 09:16:27

标签: java jvm wait

Object#wait(long, long)中的方法java.lang.Object在其文档中说明

  

此方法类似于wait方法   参数,但它允许更精细地控制时间量   在放弃之前等待通知。实时量,   以纳秒为单位测量,由下式给出:   1000000*timeout+nanos

这本身就有意义,但实现并不反映文档:

public final void wait(long timeout, int nanos) throws InterruptedException
{
    // ... Some range checks

    if (nanos >= 500000 || (nanos != 0 && timeout == 0))
    {
        timeout++;
    }

    wait(timeout);
}

正如您所看到的,它不是实际使用nanos参数,而是简单地将其舍入为毫秒并将其添加到timeout参数,然后将其用于调用不太精确的{{1}方法。


为什么wait(long)的实施与其文档有如此不同?它是JVM专门处理的内在方法吗?

2 个答案:

答案 0 :(得分:2)

这可能只是默认实现,当通过JIT编译器生成优化代码时,JVM以特定于平台的方式对其进行内在化。

类似的事情发生在 - 例如 - Math。{min,max,abs}方法中,它们在java中实现,但被编译器的优化程序集替换。

正如@Nitram所提到的,windows只提供millisecond OS-level thread scheduling/waiting。甚至在窗口下以纳秒精度测量(甚至不等待)为fairly problematic。 即更好的实现不能是默认实现,因为它们仅在某些平台上可用。

答案 1 :(得分:0)

据我所知,即使Windows中的高精度计时器也能为您提供低至毫秒(MSDN page)的分辨率。由于Java内部必须使用一些定时器实现来处理等待操作,我想这是限制因素。