根据this question,Thread.sleep
未必保证在您指定的时间内休眠:它可能更短或更长。
如果你阅读了Thread.sleep
的文档,你会发现在睡眠的确切持续时间内没有强有力的保证。它具体说明了持续时间
受系统计时器和调度程序的精确性和准确性的影响
(有意)含糊不清,但暗示不应过分依赖持续时间。
特定操作系统上可能的睡眠持续时间的粒度由线程调度程序的中断周期决定。
在Windows中,调度程序的中断周期通常在10或10左右 15毫秒(我相信这是由处理器决定的),但是a 可以在软件中请求更高的周期,Hotspot JVM也可以这样做 当它认为必要时
Source,强调我的
我怎样才能保证睡眠持续时间至少是我指定的值?
答案 0 :(得分:5)
最佳实用解决方案是在剩余时间内为睡眠计时并继续睡眠:
public void sleepAtLeast(long millis) throws InterruptedException
{
long t0 = System.currentTimeMillis();
long millisLeft = millis;
while (millisLeft > 0) {
Thread.sleep(millisLeft);
long t1 = System.currentTimeMillis();
millisLeft = millis - (t1 - t0);
}
}
代码和信息来自here