2012-10-08 51 views
3

我有一個接收數據更新的類(如下所示)。我的目標是查明自上次數據更新後5分鐘沒有收到數據更新。自上次數據事件以來的時間過去了

這是我的代碼:

public class DataListener { 

    private final ScheduledThreadPoolExecutor executor; 
    private ScheduledFuture<Void> future; 

    public DataUpdateListener() { 
     executor = new ScheduledThreadPoolExecutor(1); 
    } 

    /** 
    * Start listening for data. 
    */ 
    public void start() { 
     // do some setup... 

     rescheduleTask(); 
    } 

    /** 
    * Called whenever a data event is received. 
    */ 
    public void onEvent(final DataEvent event) { 
     System.out.println("Received event: " + event); 
     rescheduleTask(); 
    } 

    private synchronized void rescheduleTask() { 
     // cancel the existing task 
     if (future != null) { 
      future.cancel(true); 
      executor.purge(); 
     } 

     // schedule a new one 
     future = executor.schedule(new Callable<Void>() { 
      @Override 
      public Void call() { 
       System.out.println("No data events received in the last 5 minutes!"); 
       // do some stuff... 
       shutdown(); 
       return null; 
      } 
     }, 5, TimeUnit.MINUTES); 
    } 

    void shutdown() { 
     executor.shutdownNow(); 
    }  
} 

類保持ScheduledThreadPoolExecutor。無論何時收到數據更新,它都會取消現有任務並安排新的任務。

我想知道如果這種方法是好的,或者如果有更好的方法來做到這一點。

+1

我可能有點偏離,但如果我理解正確,您正在嘗試實施關機定時器,即如果現在在5分鐘內收到事件,請關閉執行程序? – posdef

+0

不僅如此......如果在5分鐘內沒有收到任何事件,我必須做一些其他處理。 – dogbane

回答

1

您是否考慮過優先級隊列的實現?如果我沒有誤解你的問題,在這種情況下,像PriorityBlockingQueue可能會有用。特別是您可以檢查poll()方法所需的超時值。

0

在您的方法中,您明確cancel是計劃的任務,並計劃一個新的計劃任務。這不是重新安排 ..這實際上是重新創建一個時間表。國際海事組織,最好將您的「即將」計劃存儲在清單中......或queuestack。然後在準備好時檢索任務。

相關問題