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专门处理的内在方法吗?
答案 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内部必须使用一些定时器实现来处理等待操作,我想这是限制因素。