Thread類中的sleep(long millis, int nanos)並沒有實現ns級別的睡眠.
阿新 • • 發佈:2019-01-29
Thread 中的方法public static void sleep(long millis, int nanos)從引數來看,執行緒睡眠設定的時間為millis + nanos.但實際上並非如此.
來看一下原始碼:
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);
}
注意這兩處程式碼
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
sleep(millis);
方法對傳入的nanos進行了判斷
1.也就是當nanos大於等於500微秒時,millis就加1.當nanos小於500微秒時,不改變millis的值.
2.當millis的值為0時,只要nanos不為0,就將millis設定為1.
因此,從程式碼上來看,睡眠的最小單位仍為millis.最小的睡眠時間為1millis.