我想知道转换大纳秒值的最准确方法是毫秒和纳秒,纳秒数上限为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) {
}
}
}
干杯, 克里斯
答案 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)。它会为您执行此计算,然后在对象上等待调用。
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方法类似。