31

我想知道将大纳秒值转换为毫秒和纳秒的最准确方法是什么,纳秒上限为 999999。目标是结合纳秒和毫秒值以确保最大分辨率可能与限制给定的。这是为了与睡眠/等待方法和其他一些给出大纳秒值的外部库进行比较。

编辑:我的代码现在如下所示:

while (hasNS3Events()) {                                
    long delayNS = getNS3EventTSDelay();
    long delayMS = 0;
    if (delayNS <= 0) runOneNS3Event();
    else {
        try {
            if (delayNS > 999999) {
                delayMS = delayNS / 1000000;
                delayNS = delayNS % 1000000;
            }

            EVTLOCK.wait(delayMS, (int)delayNS);
        } catch (InterruptedException e) {

        }
    }
}

干杯,克里斯

4

4 回答 4

100

为什么不使用内置的 Java 方法。TimeUnit 是并发包的一部分,因此完全适合您的需要

  long durationInMs = TimeUnit.MILLISECONDS.convert(delayNS, TimeUnit.NANOSECONDS);
于 2014-02-06T10:29:41.857 回答
98

对于使用 的更短的转换java.util.concurrent.TimeUnit,相当于 Shawn 上面写的,您可以使用:

    long durationInMs = TimeUnit.NANOSECONDS.toMillis(delayNS);
于 2014-11-24T15:17:59.963 回答
29

只需将 divmod 与 1000000 相加即可。

于 2010-11-29T03:38:33.357 回答
1

TimeUnit.timedWait(Object obj, long timeout) 是您应该使用的。它为您执行此计算,然后在对象上调用等待。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#timedWait(java.lang.Object,%20long)

Java 8 的实现(查看它基于纳秒计算 ms 和 ns):

public void timedWait(Object obj, long timeout)
        throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        obj.wait(ms, ns);
    }
}

所以你会使用

TimeUnit.NANOSECONDS.timedWait(EVTLOCK, delayNS);

还有类似的 sleep 和 timedJoin 方法。

于 2020-06-30T20:13:43.057 回答