[英]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(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.