有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java线程。睡眠时间最短

{a1}文档对其论点进行了如下描述:

timeout - the minimum time to sleep.

然而,我发现——至少在64位的Windows 7上,Java 8 update 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被设计为只在指定的持续时间大约而不是至少内睡眠


共 (1) 个答案

  1. # 1 楼答案

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

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