【问题标题】:How to use method Object.wait(long timeout, int nanos)如何使用方法 Object.wait(long timeout, int nanos)
【发布时间】:2014-07-26 13:51:13
【问题描述】:

我正在阅读有关 Object 的课程,并找到了一个方法 wait(long timeout, int nanos)。

我阅读了Docs Oracle Class Object 的描述,发现:

以纳秒为单位测量的实时量由下式给出:

1000000*timeout+nanos

参数:
timeout - 等待的最长时间,以毫秒为单位。
nanos - 额外的时间,以纳秒为单位0-999999。

我查看了这个方法的实现(openjdk-7u40-fcs-src-b43-26_aug_2013),我发现了这段代码:

public final void wait(long timeout, int nanos) throws InterruptedException {
    if (timeout < 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 && timeout == 0)) {
        timeout++;
    }

    wait(timeout);
}

第一个和第二个ifs 很明显。第三个什么都不做,或者只是增加timeout,不关心nanos。

我的问题是,我如何调用 wait(long timeout, int nanos) 方法,它真正适用于给定的 nanos?

提前谢谢你

【问题讨论】:

  • 使用不同的虚拟机。如果您检查其他 vm 源,您最终会找到一个在本机代码中实现了该等待的源。您还需要一个支持纳米计时器的操作系统。

标签: java


【解决方案1】:
【解决方案2】:

它确实考虑到了 nanos:第三个 if 说:

if (nanos >= 500000...
    timeout++;

这意味着如果我们有超过 500000 纳秒,我们会将其向上舍入到另一个毫秒,否则,我们会将其向下舍入。

这也符合定义:1000000*timeout+nanos 转换回毫秒后。

【讨论】:

  • 比方说,我想等待3000 milis 和500005 nanos = 3000 500005 nanos。我使用参数wait(3000, 500005) 运行方法。 500005 &gt; 500000,所以它进入if 并执行timeout++ 和方法wait(3001) 将被调用。在我看来不一样,我不想要wait(3000) 或wait(3001) 我想要的是wait(3000, 500005)
  • @ruhungry 我知道这不是您想要的,但这就是 JDK 开发人员实现它的方式。此外,由于诸如调度程序事件和上下文切换之类的操作系统事件 - 即使在毫微秒内,您也不能保证获得准确的等待时间
猜你喜欢
  • 2022-08-13
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2011-09-01
相关资源
最近更新 更多