将纳秒转换为毫秒和纳秒(< Java中的999999

时间:2010-11-29 03:36:16

标签: java time milliseconds nanotime

我想知道转换大纳秒值的最准确方法是毫秒和纳秒,纳秒数上限为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 个答案:

答案 0 :(得分:80)

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

  long durationInMs = TimeUnit.MILLISECONDS.convert(delayNS, TimeUnit.NANOSECONDS);

答案 1 :(得分:67)

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

    long durationInMs = TimeUnit.NANOSECONDS.toMillis(delayNS);

答案 2 :(得分:22)

只需使用1000000的divmod。

答案 3 :(得分:0)

您应该使用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方法类似。