2

ScheduledThreadPoolExecutor を使用して定期的なタスクを実行しています。一定の遅延ではなく、定期的に実行することが不可欠です。

次の問題が発生しました: タスクの期間を 1 分と考えてください。タスクの実行に 5 分かかる場合 (たとえば、一時的なネットワークの問題が原因)、失敗した実行はキューに入れられ、タスクの終了直後にディスパッチされます。逃した累積実行を取り除く方法はありますか?

remove メソッドを使用してみましたが、特定の実行だけでなく、タスクを完全に削除します。

ありがとう

4

3 に答える 3

2

より良い方法があるかもしれませんが、タスク自体を再スケジュールすることができます。そうすれば、前の実行が終了してから常に 1 分後に 1 つの実行が実行されます。

final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable yourTask = new Runnable() {

    @Override
    public void run() {
        //do your stuff
        scheduler.schedule(this, 1, TimeUnit.MINUTES);
    }
};
scheduler.schedule(yourTask, 1, TimeUnit.MINUTES);

編集

タスクを正確に hh:mm:00 (正確な分) に実行する場合は、コードを次のように置き換えることができます。

long millisToNextMinute = 60000 - System.currentTimeMillis() % 60000;
scheduler.schedule(this, millisToNextMinute, TimeUnit.MILLISECONDS);
于 2012-08-08T12:51:52.940 に答える
1

このロジックをタスクに組み込むことができます。タスクを最後に実行したときに記録します。起動するたびに、最後の実行から十分な時間が経過したかどうかを確認する必要があります。そうでない場合は、何もせずに終了する必要があります。

于 2012-08-08T13:07:48.903 に答える