2013-12-20 47 views
0

我有一個程序以不同的時間間隔執行事件。每個事件都被分配了一個EVENTTIME這樣的:繼續解除序列化後停止的程序

public abstract class Event implements Serializable{ 
    private long eventTime; 
    protected final long delayTime; 


    public Event(long delayTime) { 
     this.delayTime = delayTime; 
     System.out.println(this.delayTime); 
     start(); 
    } 

    public void start() { // Allows restarting 
    eventTime = System.currentTimeMillis() + delayTime; 

    } 

    public boolean ready() { 
    return System.currentTimeMillis() >= eventTime; 
    } 

    public abstract void action() throws ControllerException; 
} 

我使用ArrayList舉行的活動和一個for循環啓動事件。如果再發生特殊事件的程序正在使用的序列化保存,然後終止:

public abstract class Controller implements Serializable{ 

    private List<Event> eventList = new ArrayList<Event>(); 
    public void addEvent(Event c) { 
     eventList.add(c); 
    } 

    public abstract void saveState(); 
    public abstract void shutdown(); 

    public void run() { 
     while(eventList.size() > 0) 

     for(Event e : new ArrayList<Event>(eventList)) 
      if(e.ready()) { 
       System.out.println(e); 
      try { 
       e.action(); 
      } 
      catch(ControllerException ex) { 
       System.err.println("Reason: " + ex + "\n"); 
       System.out.println("State has been saved"); 
       System.out.println(ex.getErrorcode()); 
       eventList.remove(e); 
       System.out.println(eventList); 
       saveState(); 
       shutdown(); 
      } 
      eventList.remove(e); 
     } 
    } 
} 

當我反序列化類和恢復程序,被留在ArrayList中的任何事件來執行,但他們立即執行,因爲他們的準備()要求已經滿足。

如何更改已保存在序列化類中的舊System.currentTimeMillis(),以便在稍後恢復該程序時它將更新到新的System.currentTimeMillis()?

回答

2

將列表反序列化後,運行其中的對象並將保存的時間更新爲新的時間。

你也可以通過反序列化過程來做一些事情,但老實說,通過設置值來運行要簡單得多。

例如:

long startTime = System.currentTimeMillis(); 
for (Event e: eventList) { 
     e.setEventTime(e.getDelayTime()+startTime); 
} 

如果你想只保留剩餘延遲,那麼你也將需要存儲在你的序列化,這樣就可以制定出新的偏移量的時間。要實現該方法:

long startTimeOffset = System.currentTimeMillis() - timeAtWhichWeSaved; 
for (Event e: eventList) { 
     e.setEventTime(e.getEventTime()+startTimeOffset); 
} 
2

您需要存儲的不僅僅是事件,還需要存儲序列化的時間。然後在反序列化之後,計算當前時間和序列化時間之間的差異,並相應地更新所有事件。所以假設在時間T = 10你創建了一個事件在15個刻度時間內觸發,所以T = 25。然後在T = 20時序列化數據 - 剩下5個刻度。

在T = 50你反序列化,並計算序列化時間(20)和現在(50)之間的差異 - 這意味着你需要在每個「準備時間」中加30。你的事件將更新爲在T = 55時觸發,這是正確的,因爲它在5次蜱時間內也是如此。

您可以使用自定義序列化代碼來替代絕對截止日期序列化「剩餘時間量」,並反序列化到新的截止日期。