2017-01-16 10 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が使用するユニットはどれですか?または、私はそれらを2番目と考えてもいいですか?それとも実世界の時間に変換する計算がありますか?事前に

おかげで、

敬具は、

UPDATE:回答を

おかげで、私は正確な時間を計測してみましたが、私はここに問題を抱えています。既存の仮想シミュレーション時間は、ネットワーク寿命を測定しています。そして、それは例のための正確な時間と同じではありません。 75台のデバイスのシミュレーションを実行すると、netorklifetimeが短くなって70.0と表示されますが、実時間は寿命が1500.0以上のデバイスが35台以上になります。これはイベントが各デバイスで繰り返されるために発生します。

ここで私は仮想シミュレーション時間の単位を見つける必要があります。

おかげで再び...

+1

注: 'Comparable'生ではない、' 'Comparableをを実装します。 –

+0

私はSystem.nanoTime()(long)とTimeUnitクラスを使って時間を表示します。 nanoTime()は、経過時間を測定するためだけにあります – efekctive

答えて

0

あなたは役に立つかもしれ

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(); 
} 

いくつかの点、のように、個別のイベントをシミュレートするScheduledExecutorServiceを使用することがあります。

  1. 私はそれを考えていませんあなたが持っているコアの数(上記の例では4)よりもプールのサイズを設定する価値があります
  2. の必要はありません私はあなたが執行またはスレッドを使用したくない場合は、むしろdouble

よりUPDATEを時間フィールドのlongタイプを使用することになり

  • 上記のスニペット用Comparableを実装するには、時間によってイベントをソートすることができますイベントは以下のように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(); 
    } 
    
  • 関連する問題