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

根据这个问题 , Thread.sleep不一定保证在您指定的持续时间内hibernate:它可能更短更长。

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

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

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

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

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

来源 ,强调我的

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

最好的实际解决方案是在剩余时间内计时睡眠并继续睡眠:

 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); } } 

代码和信息来自这里