2017-01-16 59 views
0

我正在研究Java中的離散事件模擬,與時間相關的代碼如下所示;Java中的離散事件模擬時間單位

class Event implements Runnable, Comparable { 
    double time; 
    Runnable runnable; 

    Event(double time, Runnable aRunnable) { 
     this.time = time; 
     runnable = aRunnable; 
    } 

    public boolean lessThan(Comparable y) { 
     Event e = (Event) y; // Will throw an exception if y is not an Event 
     return this.time <= e.time; 
    } 

    @Override 
    public void run() { 
     runnable.run(); 

    } 
} 

class Simulator extends AbstractSimulator { 

    static Random rnd; 
    static double time; 
    double endTime; 


    static double now() { 
     return time; 
    } 

    Simulator(long seed, double simDuration) { 
     time = 0.0; 
     events = new ListQueue(); 
     rnd = new Random(seed); 
     endTime = simDuration; 
    } 

    void doAllEvents() { 
     Event e; 
     while ((e = (Event) events.removeFirst()) != null && time < endTime) { 
      if(time > e.time) 
       System.out.printf("Something is worng! time=%f eventtime=%f",time,e.time); 
      time = e.time; 
      e.run(); 
      System.out.printf("\n Time = %f", time); 

     } 
    } 

我認爲基於事件失敗時的結果,但我需要使用一個單位的時候,我繪製。

Java用於模擬時間的單位是什麼?或者我可以將它們視爲第二個?或者是否有任何計算將其轉換爲真實的世界時間?

由於提前,

最好的問候,

UPDATE:

感謝您的答案,我試圖測量精確的時間,但我在這裏有一個問題。現有的虛擬仿真時間正在測量網絡壽命。它的作用與確切的時間不一樣。當我運行75個設備的模擬時,netorklifetime更短,可以說70.0,但實際時間超過35個設備,且擁有1500.0的壽命。發生這種情況是因爲每個設備的事件都在重複。

我在這裏需要找到虛擬模擬時間的單位。再次

謝謝...

+1

注:實現可比'',不生'Comparable'。 –

+0

對於時間我會使用System.nanoTime()(long)和TimeUnit類來呈現它們。 nanoTime()只是爲了測量流逝的時間 – efekctive

回答

0

您可以使用ScheduledExecutorService來模擬離散事件,就像

List<Event> events = new ArrayList<Event>(); 
ScheduledExecutorService executor = Executors.newScheduledThreadPool(4); 
for (Event event : events) { 
    executor.schedule(event, (long) event.time, TimeUnit.MILLISECONDS); 
} 
try { 
    executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

幾個點,這可能會有所幫助:

  1. 我不認爲這值得設置游泳池的大小超過您擁有的核心數量(在上面的示例中爲4)
  2. 不需要Event實施Comparable以上
  3. 的片段,我會用long類型時間字段,而不是double

UPDATE如果你不想使用執行人或線程,可以按時間排序事件而等到事件應使用如下while循環觸發:

List<Event> events = new ArrayList<Event>(); 
events.add(new Event(1000d,() -> System.out.println("event1"))); 
events.add(new Event(2000d,() -> System.out.println("event2"))); 
//adding more events ... 
Collections.sort(events); 

//Fix start time 
long start = System.currentTimeMillis(); 
for (Event event : events) { 

    //Wait until event time is <= than current - start time 
    while (event.time > System.currentTimeMillis() - start); 
    event.run(); 
}