【问题标题】:Add a decimal millisecond delay to Java code向 Java 代码添加十进制毫秒延迟
【发布时间】:2012-11-14 17:31:49
【问题描述】:

我想在我的 java 代码中添加 0.488 毫秒的延迟。但是 thread.sleep() 和 Timer 函数只允许毫秒的粒度。如何指定低于该级别的延迟量?

【问题讨论】:

标签: java multithreading events timeout timedelay


【解决方案1】:

从 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); 

【讨论】:

  • 如果你想等待少量微秒,你不能依赖这个。这样做的唯一方法是忙于等待线程。
【解决方案2】:

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

请注意,您无法保证睡眠的精确度。根据您的系统,计时器可能只精确到 10 毫秒左右。

【讨论】:

  • 在WIndows JDK1.6.0_37中,这个方法只是增加一毫秒,然后调用Thread.sleep()。它完全忽略了纳米时间。
  • @kornero:这就是为什么你不能保证这种方法的精度 :) 然而,在某些系统上你可以获得亚毫秒级的精度。
【解决方案3】:

TimeUnit.anything.sleep() 调用 Thread.sleep() 和 Thread.sleep() 四舍五入 到毫秒, 所有 sleep() 都无法使用,精度低于毫秒

Thread.sleep(long millis, int nanos) 实现:

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); 也是同样的情况

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2017-09-03
    • 2020-04-05
    • 2018-07-27
    相关资源
    最近更新 更多