1

Thread.sleep(500) 将暂停当前线程至少 500 毫秒,我知道它可能比 500 多一点,但它永远不会少于那个。现在 1 毫秒 = 1000000 纳秒我想暂停当前线程 500 毫秒,即 = 500*1000000 纳秒但是当我运行以下代码时,它有时会以纳秒为单位休眠小于指定值。为什么是这样?以及如何睡眠至少 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
4

2 回答 2

2

我知道它可能比 500 多一点,但绝不会少于这个。

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

无法保证持续时间是绝对最小值。

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

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

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)。

于 2015-12-31T02:57:17.587 回答
0

API文档说时间是

受系统计时器和调度程序的精度和准确性的影响

所以它休眠的确切时间没有定义。
话虽如此,如果线程在一毫秒的中途开始休眠,然后在指定的毫秒开始时唤醒,那么它可以休眠最多 1 毫秒。
如果您需要精确的计时,那么 Thread.sleep 可能是错误的工具,实际上任何垃圾收集语言都可能是错误的工具。

在更精确的延迟或周期上运行代码的一种方法是使用ScheduledExecutorService

于 2015-12-31T02:58:25.683 回答