2016-11-17 2 views
0

私はjava.util.Timerクラスを使用しています。繰り返しタスクを実行するために使用します。 (例えば毎秒状態をチェックするポーリング機構)。タイマーが予定より遅れた場合

timer.scheduleAtFixedRate(new Poller(), 0, pollingInterval); 

問題の場合は、次のとおりです。タイマーが後ろに落ちることができます。例えば毎秒実行する必要がある場合、タスクの実行には2秒かかります。

ドキュメンテーションによれば、タイマーは追いつこうとします。例えば突然、タスクの実行に0.5秒しかかからない場合は、速度が上がります。

まず第一に、私は、を疑問に思って、それは後ろに動いているかどうかを検出するビルトイン方法があります。

しかし、とにかく、キャッチアップの動作を無効にする方法を探しています。 遅れている場合は、私はちょうど2サイクルをスキップしたい。

は(私も同様のタスクのためにScheduledThreadPoolExecutorを使用しましたそれは、より多くのオプションを持って、そして多分それは解決策になることができます。しかし、それを見つけるために少しあまりにも圧倒的だ。。。)

EDIT:

私はそれについて考えると、私はScheduledThreadPoolExecutorでそれを行う方法は、タスク実行の間にの間隔を使用してscheduleWithFixedDelayメソッドを使用することだと思う。

まだ、Timerで同じことを達成する方法はありますか?

答えて

0

タイマーが遅れた場合は、その理由などのThread.sleepを持つ単純なwhileループ、使用しない、気にしない場合:これが原因OSのスケジューリングの制約に遅れた場合は

while(condition) { 
    // do work here 
    Thread.sleep(1000L); 
} 

を、それが失われた時間を補うことは決してないでしょう。指定した時間以上は常に遅れます。覚えておいて、シンプルではなく複雑です。

関連する問題