3

Spring の TaskScheduler を使用して定期的なタスクをスケジュールしています。

ScheduledFuture scheduleAtFixedRate(Runnable task, long period);

ScheduledFuture で cancel() を呼び出して、定期的なタスクの実行を停止できることを理解しています。しかし、タスクの実行結果に応じて定期的にスケジュールされたタスクをキャンセルしたいのですが、それを行う最善の方法がわかりません。

ScheduledFuture では、実行された各タスクの結果にアクセスできますか? それとも、この ScheduledFuture への参照を保持し、その方法でキャンセルできるタスク リスナーが必要ですか? または、他の何か?

4

3 に答える 3

3

可能のように見えますが、おそらくもっと良い方法があります。

定期的なジョブは Runnable (戻り値の型が void) のみを受け取るため、タスクの結果を返す方法はありません。したがって、繰り返しタスクを停止する唯一の方法は、タスクに副作用を実行させることです。たとえば、キュ​​ーに停止メッセージを追加するなどです。次に、別のスレッドがこのキューを監視する必要があり、メッセージが表示されたらジョブをキャンセルできます。

非常に面倒で複雑です。

より良い代替手段は、通常の (1 回限りの) スケジュールされたタスクを作成することです。タスク自体は、別のタスクをスケジュールする必要があるかどうかを判断し、次のタスク自体のスケジュールを設定できます。

于 2013-02-28T22:55:47.530 に答える
2

ハンドルまたは元の固定レートScheduledFutureを保持し、キャンセルしたい状況が発生したときに、キャンセルを行う新しいタスクをスケジュールします。

で何かできることもありますRunnableScheduledFuture

ScheduledExecutorServiceドキュメントから

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

 import static java.util.concurrent.TimeUnit.*;
 class BeeperControl {
   private final ScheduledExecutorService scheduler =
     Executors.newScheduledThreadPool(1);

   public void beepForAnHour() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle =
       scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
     scheduler.schedule(new Runnable() {
       public void run() { beeperHandle.cancel(true); }
     }, 60 * 60, SECONDS);
   }
 }
于 2016-05-06T22:27:17.017 に答える