不幸的是,从 Java 6 开始,Windows 操作系统上所有与睡眠相关的方法 [包括 LockSupport.awaitNanos()] 都基于毫秒,正如上面几个人所提到的。
计算精确间隔的一种方法是“旋转产量”。方法 System.nanoTime() 为您提供相当精确的相对时间计数器。此调用的成本取决于您的硬件,并且位于 2000-50 纳秒左右。
以下是 Thread.sleep() 的建议替代方案:
public static void sleepNanos (long nanoDuration) throws InterruptedException {
final long end = System.nanoTime() + nanoDuration;
long timeLeft = nanoDuration;
do {
if (timeLeft > SLEEP_PRECISION)
Thread.sleep (1);
else
if (timeLeft > SPIN_YIELD_PRECISION)
Thread.yield();
timeLeft = end - System.nanoTime();
} while (timeLeft > 0);
}
这种方法有一个缺点 - 在等待命中 CPU 内核的最后 2-3 毫秒期间。请注意, sleep()/yield() 将与其他线程/进程共享。如果你愿意牺牲一点 CPU,这会给你非常准确的睡眠。