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 楼答案
TimeUnit.sleep()
委托给Thread.sleep()
Thread.sleep()
取决于系统计时器和调度程序的精度和准确性,因此TimeUnit.sleep()
将不会像您需要的那样精确