java - Thread.sleep(毫秒)精度

标签 java thread-sleep nanotime

Thread.sleep(500) 会将当前线程挂起至少 500 毫秒,我知道它可能略高于 500 毫秒,但绝不会少于此值。 现在 1 毫秒=1000000 纳秒 我想将当前线程挂起 500 毫秒,即=500*1000000 纳秒 但是当我运行以下代码时,它有时会 sleep 少于指定值(以纳秒为单位)。为什么是这样?以及如何 hibernate 至少 500*1000000 纳秒。

long t1=System.nanoTime();
    try{
        Thread.sleep(500);
    }catch(InterruptedException e){}
    long t2=System.nanoTime();

    System.out.println((t2-t1)+" nanoseconds");
    System.out.println((500*1000000-(t2-t1))+" nanoseconds");

有时输出是

499795328 nanoseconds
204672 nanoseconds

最佳答案

I know it may be little more than 500 but it's never less than that.

我不确定你是从哪里得到这个想法的。 docs非常清楚地表明它将 hibernate “指定的毫秒数,取决于系统计时器和调度程序的精度和准确度”。

没有什么可以保证持续时间是绝对的最小值。

如果您想更接近理想状态,那么您已经有了一半的解决方案,因为您正在计算持续时间还剩多少纳秒。要计算出还需要 hibernate 多少毫秒,您可以将差额(本例中为 204672)除以 1000,然后再次 hibernate 。

事实上,您可能希望循环执行此操作,直到剩余时间达到零。像下面的伪代码这样的东西可能会起作用:

def sleepFor (ms):
    baseTime = System.nanoTime()
    remainingTime = ms
    while remainingTime > 0:
        Thread.sleep(remainingTime)
        nowTime = System.nanoTime()
        remainingTime = ms - (nowTime - baseTime) / 1000

或者您可以简单地接受这样一个事实:足够接近就足够好了,因为您的误差似乎约为 0.04%(约百万分之 400)。

关于java - Thread.sleep(毫秒)精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34540229/

相关文章:

java - 如何解决 'Initialize the log4j system properly'错误?

linux - 使所有线程休眠 linux/unix

java - 在一次定时器操作中更新标签两次

java - 比较 Java 中使用纳米时间的方法速度性能

java - Java nanoTime 的多线程

java - DynamoDBMapper 注释。一对多映射

java - 将 ResultSet 转换为 int 数组

java - 为什么这个简单的 C++ 添加比等效的 Java 慢 6 倍?

java - 为什么servlet-api.jar的状态会从测试状态变成编译状态?

c# - 线程没有真正休眠?