2012-11-27 34 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);