在JDK中,它实现为:
public static void sleep(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
sleep(millis);
}
这意味着nanos
参数根本不做任何事情。
它背后的想法是,在具有更准确时序的硬件上,JVM可以为它提供更好的实现吗?
答案 0 :(得分:14)
常规操作系统没有足够精细的分辨率,无法一次睡眠纳秒。但是,real time operating systems存在,其中安排事件在确切时刻发生是至关重要的,并且许多操作的延迟非常低。 ABS系统是RTOS的一个示例。睡眠纳秒在这样的系统上比在普通操作系统上更有用,因为操作系统无法在不到15毫秒的时间内可靠地睡眠。
然而,拥有两个单独的JDK并不是解决方案。因此,在Windows和Linux上,JVM将为 x 纳秒进行最佳的睡眠尝试。
答案 1 :(得分:7)
它看起来像是一个面向未来的新增功能,因为当我们都拥有petaflop笔记本电脑时,我们通常会以纳秒为单位指定延迟。同时,如果指定纳秒延迟,则会得到毫秒延迟。
当硬件改进并且JVM跟随时,应用程序将不需要重写。
答案 2 :(得分:0)
未来打样的问题是向后兼容。这种方法已经使用了这么长时间,如果你想要亚微秒级的延迟,你必须使用不同的方法。
为了比较,
Object.wait(millis, nano);