【发布时间】:2016-06-22 20:31:45
【问题描述】:
[编辑]:得到答案后,我明白它不是 Java 特有的,它也与操作系统调度程序有关,所以添加其他标签
在 Java 中是否可以让线程休眠一纳秒。
当然,在查看我们可以在睡眠方法中通过纳秒的 Thread api 之后,答案可能是肯定的。
但我在查看Thread class中的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);
}
现在根据逻辑,如果经过的纳秒超过半毫秒,它会将毫秒增加1。但这对我来说听起来不合逻辑,假设我编写了一个代码,其中我的一个线程正在等待说一些40000 nano seconds(在实际情况下可能不是这种情况),这不到半毫秒,这意味着我的线程将根本不用等。
有人可以评论一下吗?为什么这个设计决定等待毫秒而不是纳秒?
还有什么可以保证线程准确唤醒?
【问题讨论】:
-
什么能保证线程准确唤醒?
-
这个问题也得到了回答:因为没有主要操作系统的调度程序以小于 1 毫秒的间隔运行。而且由于线程调度是由操作系统完成的,Java 受到操作系统的约束。
-
没有。大多数操作系统都有一个 +/- 15 毫秒(而不是纳秒)的系统计时器。
-
@Vishrant 是的。如果您查看
Thread.sleep()的 API 文档,它明确表示:Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. -
根据我的经验,少于 5 毫秒的睡眠会导致计时问题。
标签: java c multithreading operating-system