1

タイムクリティカルなタスクを毎秒実行しているため、いくつかの方法を比較して、タスクが実際に固定の時間ステップで実行されるようにするための最良の方法を見つけました。すべてのメソッドのエラーの標準的な導出を計算した後、そのメソッドを使用するscheduledExecutorService.scheduleAtFixedRate()と最良の結果が得られるように見えますが、なぜそうなるのかわかりません。

そのメソッドが内部でどのように機能するかを誰かが知っていますか?sleep()たとえば、参照されたタスクが実際に固定の時間ステップで実行されることを単純に確認するのと比較して、どのようにすればよいでしょうか。

4

2 に答える 2

4

「通常の」Java VM は、実行時間 (およびその結果としてスケジューリング時間) について、厳密なリアルタイム保証を行うことはできません。本当にリアルタイムの保証が必要な場合は、Java RTSのようなリアルタイム VM を検討する必要があります。もちろん、その場合もリアルタイム OS が必要です。

Thread.sleep() との比較について: Thread.sleep() の (素朴な) 使用法と比較した ScheduledExecutorService.scheduleAtFixedRate() の利点は、スケジュールされたタスクの実行時間の影響を受けないことです。これがどのように実装されているかについては、ScheduledFutureTask.runPeriodic() を参照してください。

于 2009-10-03T17:25:15.470 に答える
1

ScheduledExecutorService インターフェースを実装する唯一のクラスであるScheduledThreadPoolExecutor.javaの OpenJDK7 実装を見ることができます。

ただし、私の知る限り、ScheduledExecutorService には精度に関する保証があります。したがって、測定値がこれを正確であると示していても、別のプラットフォーム、 vm または jdk に切り替えると、そうではない可能性があります。

于 2009-10-03T12:38:33.650 に答える