Java Thread.sleep 最短时间

标签 java thread-sleep

<分区>

TimeUnit.sleep(long timeout)文档这样描述它的论点:

timeout - the minimum time to sleep.

但是,我发现 — 至少在带有 Java 8 update 141 的 Windows 7 64 位上 — 线程 hibernate 的时间通常少于:

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!"));
    }
}

典型输出:

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!

这似乎与文档相矛盾。然而,TimeUnit 文档还指出 TimeUnit.sleep()Thread.sleep 的便利包装器,而后者没有说明它是否保证至少 sleep 指定数量。

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

最佳答案

TimeUnit.sleep() 委托(delegate)给 Thread.sleep()

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

关于Java Thread.sleep 最短时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419940/

相关文章:

C# - 在控制台应用程序中精确使用 Thread.Sleep

java - 对象输入流异常

java - HashMap 上的多个键 : it deletes existing values?

c - 使用信号量的 sleep 理发师

java - 目前在java中使用thread.yield()是好的做法吗?

java - 临时空白JPanel

java - 对于声明不起作用

java - 如何写入 CSV 文件的新行

java - Hibernate 注解 - 成人和可连接(父子)

java - 暂停线程的最佳方法?