【问题标题】:Java Thread.sleep for minimum time [duplicate]Java Thread.sleep 最短时间[重复]
【发布时间】:2017-07-31 15:33:09
【问题描述】:

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

timeout - 睡眠的最短时间。

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

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 的便利包装,后者并没有说明它是否保证至少睡眠指定的数量。

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

【问题讨论】:

  • 我一直认为它们是近似的,不能保证
  • 系统时钟的分辨率通常为 15ms。你为什么要在纳秒内入睡?
  • @ElliottFrisch 我不想在纳秒内睡觉,我也不想准确地说,但我想睡至少所需的时间。多一点就好了。我只使用纳秒,因为 Java 的单调时钟是 System.nanoTime() - 没有替代单位。 System.currentTimeMillis() 不适合,因为它会受到时钟调整的影响。
  • 男人。我输入了一个相当长的答案,现在我无法发布它。有人可以投票重新开放吗?
  • 是的,这是垃圾。我刚刚发布了一个类似(尽管略有不同)的问题and answered it myself,以防您感兴趣。

标签: java thread-sleep


【解决方案1】:

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

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

【讨论】:

  • 谢谢。因此,当 TimeUnit javadoc 说“超时 - 睡眠的最短时间”时,它是在撒谎。
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2021-09-01
  • 2019-08-21
  • 1970-01-01
  • 2015-04-18
  • 2016-08-01
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多