【发布时间】:2017-06-27 02:58:42
【问题描述】:
我写了一个简单的程序,发现我的线程太快了,无法运行 JVisualVM,标记我想要监控的应用程序,插入并查看线程。然后我让他们睡觉。并且注意到工具现在将它们报告为仅在睡眠(或几乎仅在睡眠)。即使他们工作。这就引出了一个问题:为什么?!
new Thread(() -> {
while(true) {
System.out.println("not sleeping");
try {
Thread.sleep(0,1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "not sleeping!").start();
这个线程应该休眠 1 纳秒,但看看 JVisualVM 是如何报告的:
运行 57 秒后,它报告运行时间为 5 秒,休息为睡眠 - 是错误还是我的理解有误?
不仅仅是 JVisualVM:
$ while true; do jstack 8277 | grep -A 2 not; done [% 20:34:27]
"not sleeping!" #10 prio=5 os_prio=0 tid=0x00007f5ea82d1000 nid=0x2078 waiting on condition [0x00007f5e917c6000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
jstack 也只是偶尔将此线程报告为 RUNNING。我期望不同的比例,所以请帮助我理解。
【问题讨论】:
-
您不能依赖线程在您指定的确切时间内休眠。 57s 是……不过。
-
@AndyTurner 我同意。纳米技术更是如此。但我没想到比例会……嗯,颠倒了。大部分时间都在睡觉。
标签: java multithreading