1秒ごとにタスクを繰り返す単純なスケジューラがあります:
Cancellable task = Akka.system().scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS),
Duration.create(1, TimeUnit.SECONDS),
actor, new TickMsg("Tick", 0, 120)
);
残念ながら、すべてのパスが遅れているticker-duration
ため、最終的にアクターは正確に 100 ミリ秒後に TickMsg を受信します。これはドキュメントに記載されており、私には明らかです。
正確な時間にタスクを実行するわけではありませんが、ティックごとに、期限切れのすべてを実行します。
私が理解できないのは、すべてのパスが遅れている理由です。これは事実上、すべてのパスではなく 1000ms が 1100ms を必要とすることを意味します。結果として、10 回のパスの後、1 秒の遅延があり、1 分後には 6 秒、1 時間後には 6 分など...
一部の解決策は、繰り返し期間を少し短く設定しているため、必要なティックに遅れることはありません。たとえば、機能し、スケジューラが必要に応じてタスクを繰り返します。
Cancellable task = Akka.system().scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS),
Duration.create((1000 - tickerDuration/2), TimeUnit.MILLISECONDS),
actor, new TickMsg("Tick", 0, 120)
);
残念ながら、この方法は少し不快で忘れがちTimeUnit
です。ミリ秒に変換して短縮せずに x 秒 (またはその他) ごとにタスクを繰り返す方法は他にありますか?