2013-02-28 89 views
1

我正在使用Spring的TaskScheduler安排週期性任務。根據任務的結果取消預定的固定費率任務

ScheduledFuture scheduleAtFixedRate(Runnable task, long period); 

我知道我可以調用ScheduledFuture上的cancel()來停止執行循環任務。但是我想取消定期執行的任務,具體取決於任務的執行結果,我不知道如何做到最好。

ScheduledFuture是否允許我訪問每個執行任務的結果?或者,我是否需要某種可以保留對此ScheduledFuture的引用的任務偵聽器,並以這種方式取消它?或者是其他東西?

+1

僅供參考,這是使用'ScheduledExecutorService'可能實現。所以你可能想擴大這個問題,因爲它沒有明確依賴於spring。 – 2013-02-28 03:09:34

回答

0

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

由於重複作業只需要Runnable(具有void返回類型),因此無法返回任務結果。因此,停止重複任務的唯一方法是讓任務執行副作用,例如,將停止消息添加到隊列。然後,一個單獨的線程需要監視這個隊列,並且一旦它看到該消息就可以取消該作業。

非常混亂和複雜。

更好的選擇是創建一個正常的(一次)計劃任務。任務本身可以決定是否需要調度另一個任務,並且可以執行下一個任務本身的調度。

0

保留一個句柄或原始固定費用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); 
    } 
}