【发布时间】:2022-08-13 04:19:28
【问题描述】:
我在 macOS 上使用 JDK 17。
我查看了Thread.sleep(long mills, int nanos) 和Object.wait(long mills, int nanos) 及其源代码如下:
线程.sleep:
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 > 0 && millis < Long.MAX_VALUE) {
millis++;
}
sleep(millis);
}
对象.等待:
public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
if (timeoutMillis < 0) {
throw new IllegalArgumentException(\"timeoutMillis value is negative\");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
\"nanosecond timeout value out of range\");
}
if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) {
timeoutMillis++;
}
wait(timeoutMillis);
}
因此,根据代码,纳米量实际上被忽略了——如果它大于零,那么磨机只会增加。 这是为什么? 是不是因为我的系统不支持纳米分辨率?
-
TLDR:Javadoc for
sleep说,\“...取决于系统计时器和调度程序的精度和准确性。\”他们\'通过允许您将时间指定到纳秒级来为 API 提供面向未来的验证,但他们\' re 还允许当前的实现不太准确。 -
如果您需要高精度计时,那么您应该使用real-time edition of Java,在一些real-time OS 上运行。
标签: java multithreading