根据任务的结果取消预定的固定费率任务

我使用Spring的TaskScheduler来安排定期任务。

ScheduledFuture scheduleAtFixedRate(Runnable task, long period);

我知道我可以调用ScheduledFuture上的cancel()来停止执行循环任务。 但是我想取消定期执行的任务,具体取决于任务的执行结果,我不知道如何做到最好。

ScheduledFuture是否允许我访问每个执行任务的结果? 或者,我是否需要某种可以保留对此ScheduledFuture的引用的任务侦听器,并以这种方式取消它? 或者是其他东西?


好吧,它看起来可能,但可能有更好的方法。

由于重复作业只需要Runnable(具有void返回类型),因此无法返回任务结果。 因此,停止重复任务的唯一方法是使任务执行副作用,例如向队列中添加停止消息。 然后,一个单独的线程需要监视这个队列,并且一旦它看到该消息就可以取消该作业。

非常混乱和复杂。

更好的选择是创建一个正常的(一次)计划任务。 任务本身可以决定是否需要调度另一个任务,并且可以执行下一个任务本身的调度。


保留一个句柄或原始固定费率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);
   }
 }
链接地址: http://www.djcxy.com/p/74903.html

上一篇: Cancel a scheduled fixed rate task depending on the result of the task

下一篇: Controlling a task with Timer and TimerTask?