1. 程式人生 > >Thread類中的sleep(long millis, int nanos)並沒有實現ns級別的睡眠.

Thread類中的sleep(long millis, int nanos)並沒有實現ns級別的睡眠.

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.