Java 8 使用java.time.Duration进行睡眠

Java 8 使用java.time.Duration进行睡眠,java-8,Java 8,我在java8中工作,希望使用classjava.time.Duration设置睡眠时间。 据我所知,持续时间是由秒和纳秒组成的。 因此,等待时间应等于等待: java.util.concurrent.TimeUnit.SECONDS.sleep(long); java.util.concurrent.TimeUnit.NANOSECONDS.sleep(long); 我的理解正确吗?TimeUnit.sleep功能只提供毫秒级的睡眠粒度。它将转发到Thread.sleep,并忽略纳秒

我在java8中工作,希望使用class
java.time.Duration
设置睡眠时间。 据我所知,持续时间是由秒和纳秒组成的。 因此,等待时间应等于等待:

java.util.concurrent.TimeUnit.SECONDS.sleep(long);
java.util.concurrent.TimeUnit.NANOSECONDS.sleep(long);

我的理解正确吗?

TimeUnit.sleep功能只提供毫秒级的睡眠粒度。它将转发到Thread.sleep,并忽略纳秒

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

        sleep(millis);
    }
公共静态无效睡眠(长毫秒,整数纳米)
抛出中断异常{
如果(毫秒<0){
抛出新的IllegalArgumentException(“超时值为负”);
}
如果(纳米级<0 | |纳米级>999999){
抛出新的IllegalArgumentException(
“纳秒超时值超出范围”);
}
如果(纳米>=500000 | |(纳米!=0&&millis==0)){
米利斯++;
}
睡眠(毫秒);
}
如果您想要更可靠的产品,请查看LockSupport.parknos。您应该能够在Linux上的睡眠中获得大约50us的粒度


TimeUnit.sleep功能仅提供毫秒级的睡眠粒度。它将转发到Thread.sleep,并忽略纳秒

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

        sleep(millis);
    }
公共静态无效睡眠(长毫秒,整数纳米)
抛出中断异常{
如果(毫秒<0){
抛出新的IllegalArgumentException(“超时值为负”);
}
如果(纳米级<0 | |纳米级>999999){
抛出新的IllegalArgumentException(
“纳秒超时值超出范围”);
}
如果(纳米>=500000 | |(纳米!=0&&millis==0)){
米利斯++;
}
睡眠(毫秒);
}
如果您想要更可靠的产品,请查看LockSupport.parknos。您应该能够在Linux上的睡眠中获得大约50us的粒度


如果你真的疯了,或者碰巧有一位施虐狂老师,你可以直接根据指令数量、指令周期计数和处理器时钟速度计算时间延迟/ipc@Rogue然后,一个任务切换发生,使您的线程比计算的要晚得多。或者
parknonas
会无缘无故地提前返回,这是允许的,但检查实际经过的时间将花费比预期等待时间差更多的周期…检查纳秒时间将在15/30ns之间。您可以使用CPU相关性来控制哪些线程在哪些内核上运行。如果您愿意,您甚至可以将内核与操作系统的一般用途隔离开来。这将防止/减少不必要的上下文切换,但是,您仍然无法真正控制受JIT编译和运行时优化影响的Java代码的执行时间。你在提高精度上花费的精力越多,实际收益就越小。如果你真的疯了,或者碰巧有一位虐待狂老师,你可以直接根据指令数、指令周期计数和处理器时钟速度计算时间延迟ipc@Rogue然后,任务切换发生,使线程的运行时间远远晚于计算的时间。或者
parknonas
会无缘无故地提前返回,这是允许的,但检查实际经过的时间将花费比预期等待时间差更多的周期…检查纳秒时间将在15/30ns之间。您可以使用CPU相关性来控制哪些线程在哪些内核上运行。如果您愿意,您甚至可以将内核与操作系统的一般用途隔离开来。这将防止/减少不必要的上下文切换,但是,您仍然无法真正控制受JIT编译和运行时优化影响的Java代码的执行时间。您在提高精度上花费的精力越多,实际增益就越小。不管
Duration
对象由什么组成,只要它支持各种用途的简便转换方法。因此,您可以使用,例如单个
LockSupport.parknos(duration.toNanos())
只要对象支持各种用途的方便转换方法,那么
Duration
对象由什么组成并不重要。因此,您可以使用,例如单个
LockSupport.parknos(duration.toNanos())