シンプルなプログラムを書いたところ、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によって報告されます方法を見取る:それは5Sは睡眠のように、時間と休息を実行している報告57Sのために実行した後
を - バグか私の理解は間違っていますか?
それだけではありません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私は同意します。ナノといっしょに。しかし、私はその割合が...まあ、逆転するとは期待していませんでした。それはほとんどが眠っている。 –