我怎样才能保证Thread.sleep至少能睡一段时间?

Mic*_*ael 6 java sleep

根据这个问题,Thread.sleep不一定保证在你指定的时间内睡觉:它可能更短更长.

如果您阅读了相关文档Thread.sleep,您会发现在确切的持续时间内没有强有力的保证.它具体说明了持续时间

受制于系统定时器和调度程序的精确性和准确性

这是(有意)模糊但暗示不应过分依赖持续时间.

特定操作系统上可能的睡眠持续时间的粒度由线程调度程序的中断周期确定.

在Windows中,调度程序的中断周期通常大约为10或15毫秒(我相信这是由处理器决定的),但可以在软件中请求更高的周期,Hotspot JVM在认为必要时会这样做

来源,强调我的

我怎样才能保证睡眠持续时间至少是我指定的值?

Mic*_*ael 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

代码和信息来自这里

  • 好的解决方案,但我建议不要使用currentTimeMillis。如果用户在Java应用程序运行时调整了系统时间(或使用NTP服务),则此方法的行为将不正确。改用`System.nanoTime()`。 (3认同)