【问题标题】:How can I guarantee that Thread.sleep sleeps for at least that amount of time?我怎样才能保证 Thread.sleep 至少睡了这么长时间?
【发布时间】:2018-01-07 07:23:04
【问题描述】:

根据this questionThread.sleep 不一定保证在您指定的持续时间内休眠:它可能会更短更长。

如果您阅读Thread.sleep 的文档,您会发现对于睡眠的确切持续时间没有强有力的保证。它特别指出持续时间是

取决于系统计时器和调度程序的精度和准确性

这是(故意)模糊的,但暗示不应过分依赖持续时间。

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

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

Source,强调我的

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

【问题讨论】:

  • 使线程休眠 x 次的用例是什么?你只是在安排吗?如果是这样,有更好的方法来做到这一点
  • @UserF40 我想到的一个应用程序是限制请求(或其他类型的事件),也就是说,每秒最多 N 个事件。如果您即将发出第 N 个请求,而第一个请求是在不到一秒前发出的,则您需要在发出请求之前等待至少所需的时间。
  • @UserF40 我个人没有用例(如果您查看链接问题的 cmets,您会明白我为什么要问这个问题;))但 Klitos 提到的似乎是合理的。跨度>

标签: java sleep


【解决方案1】:

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

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

【讨论】:

  • 很好的解决方案,但我建议不要使用currentTimeMillis。如果用户在 Java 应用程序运行时调整系统时间(或者您使用 NTP 服务),则此方法将出现错误。请改用System.nanoTime()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多