繁体   English   中英

一个线程可以用Java /其他语言睡眠不到半毫秒吗?

[英]Can a Thread sleep for less than half milli seconds in Java/ Other language?

[编辑]:得到答案后,我理解它不是特定于Java,它也与OS调度程序有关,所以添加其他标签

是否有可能在Java中使线程休眠纳秒。

当然,在查看Thread api后我们可以在睡眠方法中传递纳秒时,答案可能是肯定的。

但是我在查看Thread类中的sleep方法的实现/来源后怀疑,这是:

public static void sleep(long millis, int nanos)
throws InterruptedException {
    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
        millis++;
    }

    sleep(millis);
}

现在根据逻辑,如果通过的纳秒超过半毫秒,则将毫秒增加1 但这对我来说听起来不合逻辑,让我说我已经编写了一个代码,其中我的一个线程正在等待40000 nano seconds (实际情况可能不是这样),这不到半毫秒,这意味着我的线程将不要等。

有人可以评论相同的, 为什么这个设计决定等待毫秒而不是纳秒

还能保证线程准确唤醒的原因是什么?

您可以使用LockSupport的parkNanos

LockSupport.parkNanos(400_000);

但这与睡眠不同(它不可中断),它只是将请求传递给操作系统。 例如,在Windows 8上,即使parkNanos(1)也可能睡眠1毫秒。

正如biziclop指出的那样,Javadoc提到了

虚假的呼叫(即无缘无故)返回。

根据我的经验,这很少发生,但它确实发生了。


但是,你是对的,Thread.sleep()将始终睡眠至少1毫秒。 在Win XP上它可能会睡眠16毫秒(1/60秒)

还能保证线程准确唤醒的原因是什么?

使用实时操作系统。

我做的是,不要去睡觉而是忙着等。 通过这种方式,我可以更精确地停留一段时间。 如果在隔离的CPU上运行线程(在Linux中),则可以将变化减少到大约10微秒

忙碌等待的一个例子

long end = System.nanoTime() + delay;
while (System.nanoTime() < end) { /* busy waiting */ }

或者如果你想要稍微友好一点

while (System.nanoTime() < end) 
     Thread.yield();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM