2012-11-27 33 views
3

我想爲我的java代碼添加0.488 ms的延遲。但thread.sleep()和Timer函數只允許毫秒的粒度。如何指定低於該水平的延遲金額?向Java代碼添加十進制毫秒延遲

+0

檢查以下問題: http://stackoverflow.com/questions/824110/accurate-sleep-for-java-on-windows –

回答

11

由於1.5你可以使用這個漂亮的方法java.util.concurrent.TimeUnit.sleep(long timeout)

TimeUnit.SECONDS.sleep(1); 
TimeUnit.MILLISECONDS.sleep(1000); 
TimeUnit.MICROSECONDS.sleep(1000000); 
TimeUnit.NANOSECONDS.sleep(1000000000); 
+1

如果您想等待很短的微秒數,則不能依賴此項。要做到這一點的唯一方法是忙於等待一個線程。 – Dan

4

您可以使用Thread.sleep(long millis, int nanos)

請注意,你不能保證睡眠如何準確是。根據您的系統,定時器可能只精確到10ms左右。

+0

在Windows JDK1.6.0_37,這種方法只需要添加一個毫秒,並調用Thread.sleep()。它完全無視納米時間。 – kornero

+1

@kornero:這就是爲什麼你不能保證這種方法的精確度:)儘管如此,在某些系統上,你可以獲得亞毫秒級的精度。 –

2

TimeUnit.anything.sleep()調用Thread.sleep()方法和Thread.sleep()方法四捨五入到毫秒, 都睡( )不可用於小於毫秒精度

的Thread.sleep(長米利斯,INT毫微秒)執行:

public static void sleep(long millis, int nanos) throws java.lang.InterruptedException 
{ 
    ms = millis; 
    if(ms<0) { 
    // exception "timeout value is negative" 
    return; 
    } 
    ns = nanos; 
    if(ns>0) { 
    if(ns>(int) 999999) { 
     // exception "nanosecond timeout value out of range" 
     return; 
    } 
    } 
    else { 
    // exception "nanosecond timeout value out of range" 
    return; 
    } 
    if(ns<500000) { 
    if(ns!=0) { 
     if(ms==0) { // if zero ms and non-zero ns thread sleep 1ms 
     ms++; 
     } 
    } 
    } 
    else { 
    ms++; 
    } 
    sleep(ms); 
    return; 
} 

同樣的情況是用方法wait(long,int);