A Simulator Framework

PriorityQueue.java

Items in a priority queue are sorted by natural order (i.e. the compareTo() method).  A binary heap implementation can be found in BinaryHeap.java. A sorted list implementation is easy to create.

Event.java

When an event is fired, the simulator sets the clock to the event's fire time. Firing an event may produce another event.

Simulator.java

The simulator maintains a queue of events prioritized by their fire times. It perpetually

1. fire next event
2. schedule any event this creates

until the event queue is empty.

Example

Special types of events extend the Event class:

class RepeatingEvent extends Event {
   private int count = 0;
   public RepeatingEvent(int time) { super(time); }
   public Event fire() {
      if (10 < count++) return null;
      fireTime += 3;
      return this;
   }
}

In this firing a repeating event causes it to reschedule itself 3 ticks beyond its current fire time.

We can also extend the simulator:

class Demo {
   public static void main(String[] args) {
      Simulator sim = new Simulator();
      RepeatingEvent e1 = new RepeatingEvent(0);
      sim.schedule(e1);
      RepeatingEvent e2 = new RepeatingEvent(5);
      sim.schedule(e2);
      sim.run();
   }
}

Output

clock = 0
schedule = [{0}, {5}]
clock = 0
schedule = [{3}, {5}]
clock = 3
schedule = [{5}, {6}]
clock = 5
schedule = [{6}, {8}]
clock = 6
schedule = [{8}, {9}]
clock = 8
schedule = [{9}, {11}]
clock = 9
schedule = [{11}, {12}]
clock = 11
schedule = [{12}, {14}]
clock = 12
schedule = [{14}, {15}]
clock = 14
schedule = [{15}, {17}]
clock = 15
schedule = [{17}, {18}]
clock = 17
schedule = [{18}, {20}]
clock = 18
schedule = [{20}, {21}]
clock = 20
schedule = [{21}, {23}]
clock = 21
schedule = [{23}, {24}]
clock = 23
schedule = [{24}, {26}]
clock = 24
schedule = [{26}, {27}]
clock = 26
schedule = [{27}, {29}]
clock = 27
schedule = [{29}, {30}]
clock = 29
schedule = [{30}, {32}]
clock = 30
schedule = [{32}, {33}]
clock = 32
schedule = [{33}, {35}]
clock = 33
schedule = [{35}]
clock = 35
schedule = [{38}]
done