私の友人の 1 人が彼が行ったことを見せてくれましたが、私はこれがどのように起こったのかを説明するのに深刻な途方に暮れていました.時間が経過し(その部分は Thread.sleep(1000) )、一見永遠にかかりました(10秒待っていたものが完了するまでに約3分かかりました)。どのくらいの時間が経過したかを確認するためにミリタイムを使用してみました: 毎秒経過したナノタイムの量を出力し、毎秒、ナノタイムが毎秒およそ 40 ~ 50 ミリ秒移動していることを確認しました。
System.nanotime と Java に関連するバグを確認しましたが、nanotime が突然大きく増加してから停止するというバグしか見つからなかったようです。別の質問で読んだ内容に基づいてこのブログエントリも閲覧しましたが、それを引き起こす可能性のあるものは何もありませんでした.
明らかに、代わりにミリタイムを使用するだけで、この状況を回避できます。これには多くの回避策がありますが、私が興味を持っているのは、システム クロックに関するハードウェアの問題以外に、または少なくとも CPU が持つ最も正確なクロック以外に何かがあるかどうかです (それが System.nanotime が使用しているように見えるため)。このように一貫して遅く実行される可能性がありますか?
long initialNano = System.nanoTime();
long initialMili = System.currentTimeMillis();
//Obviously the code isn't actually doing a while(true),
//but it illustrates the point
while(true) {
Thread.sleep(1000);
long currentNano = System.nanoTime();
long currentMili = System.currentTimeMillis();
double secondsNano = ((double) (currentNano - initialNano))/1000000000D;
double secondsMili = ((double) (currentMili - initialMili))/1000D;
System.out.println(secondsNano);
System.out.println(secondsMili);
}
secondsNano は 0.04 のラインに沿って何かを出力しますが、secondsMili は 1 に非常に近い値を出力します。
この行に沿ったバグがSun のバグ データベースで報告されているようですが、重複としてクローズされましたが、既存のバグへのリンクはありません。これは非常にシステム固有であるように思われるため、これがハードウェアの問題であることがますます確実になっています。