規則的な (!) 間隔で 1 秒あたり約 10000 回実行されるループを作成するにはどうすればよいですか?
( Javaのパラレルポートからの連続データ取得の複製ですが、それは見つけにくく、答えられておらず、非常に古いものです)
私は見ましたがThread.sleep(long millis)
、Thread.sleep(long millis, int nanos)
Windows上のOracleのJ2SE仮想マシンは、指定した時間よりも常に1ミリ秒長くスリープします。さらに、nanos フィールドは、次のミリ秒単位に丸められているようです (検証済み、これは Thread.java のソース コードでハードコーディングされています)。
実験結果:
Thread.sleep(0)
スリープしない (100% cpu)Thread.sleep(1)
平均1.95ミリ秒スリープThread.sleep(2)
平均 2.95ms スリープThread.sleep(0, 0)
スリープしない (100% cpu)Thread.sleep(0, 1)
平均1.95ミリ秒スリープ
では、一定の間隔で毎秒 500 回以上繰り返すループを作成するにはどうすればよいでしょうか?
編集:「通常の」要件を少し緩めます。最長の遅延が決定論的で 0.1ms 未満である限り、1 つの遅延が別の遅延の 4 分の 1 のように短い場合 (つまり、ジッターは問題ではありません) は大きな問題ではありません。(これはそうではありませんScheduledExecutorService
)