The TimeUnit.sleep(长超时) http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html#sleep-long-文档这样描述了它的论点:
超时 - 最短睡眠时间。
然而,我发现——至少在带有 Java 8 更新 141 的 Windows 7 64 位上——线程经常休眠less比最小值:
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
and/or Thread.sleep
设计为仅用于睡眠大约, 而不是at least,指定的持续时间?
TimeUnit.sleep()
代表Thread.sleep()
.
Thread.sleep()
受系统定时器和调度程序的精度和准确性的影响,因此TimeUnit.sleep()
不会像您可能需要的那样准确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)