Java Thread.sleep最短时间

Kli*_*cou 6 java thread-sleep

所述TimeUnit.sleep(长超时)文档描述了它的参数这样的:

超时 - 最短睡眠时间.

但是,我发现 - 至少在带有Java 8更新141的Windows 7 64位上 - 线程的睡眠时间通常低于最小值:

public static void main(String[] args) throws InterruptedException {
    final long from = TimeUnit.MILLISECONDS.toNanos(100);
    final long to   = TimeUnit.MILLISECONDS.toNanos(1000);
    final long step = TimeUnit.MILLISECONDS.toNanos(100);
    for (long requestedSleepDuration = from; requestedSleepDuration < to; requestedSleepDuration += step) {
        long sleepStartTime = System.nanoTime();
        TimeUnit.NANOSECONDS.sleep(requestedSleepDuration);
        long sleepEndTime = System.nanoTime();
        System.out.printf(
                "requested=%9d  actual=%9d  %s%n",
                requestedSleepDuration,
                sleepEndTime - sleepStartTime,
                (sleepEndTime - sleepStartTime >= requestedSleepDuration ? "OK" : " Slept less than minimum!"));
    }
}
Run Code Online (Sandbox Code Playgroud)

典型输出:

requested=100000000  actual= 99534864  Slept less than minimum!
requested=200000000  actual=200063646  OK
requested=300000000  actual=299223086  Slept less than minimum!
requested=400000000  actual=399598620  Slept less than minimum!
requested=500000000  actual=499910360  Slept less than minimum!
requested=600000000  actual=600028523  OK
requested=700000000  actual=699604816  Slept less than minimum!
requested=800000000  actual=799230602  Slept less than minimum!
requested=900000000  actual=899490648  Slept less than minimum!
Run Code Online (Sandbox Code Playgroud)

这似乎与文档相矛盾.但是,TimeUnit文档还指出这TimeUnit.sleep()是一个方便的包装器Thread.sleep,后者没有说它是否保证至少睡觉指定的数量.

这是一个API实现错误,或者是TimeUnit.sleep和/或Thread.sleep设计为只睡眠大约,而不是至少是指定的持续时间?

Use*_*F40 4

TimeUnit.sleep()代表到Thread.sleep().

Thread.sleep()受系统计时器和调度程序的精度和准确性的影响,因此TimeUnit.sleep()不会像您可能需要的那样准确。