簡體   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