1  import java.util.PriorityQueue;
  2  
  3  public class Simulation
  4  {
  5     private PriorityQueue<Event> eventQueue;
  6     private double currentTime;
  7  
  8     /**
  9        Constructs a discrete event simulation.
 10     */
 11     public Simulation()
 12     {
 13        eventQueue = new PriorityQueue<Event>();
 14     }
 15  
 16     public double getCurrentTime()
 17     {
 18        return currentTime;
 19     }
 20  
 21     /**
 22        Compute exponentially distributed random numbers.
 23        @param mean the mean of the number sequence
 24        @return a random number
 25     */
 26     public static double expdist(double mean)
 27     {  
 28        return -mean * Math.log(1 - Math.random());
 29     }
 30  
 31     /**
 32        Adds an event to the event queue.
 33        @param evt the event to add
 34     */
 35     public void addEvent(Event evt)
 36     {
 37        eventQueue.add(evt);
 38     }
 39  
 40     /**
 41        Displays intermediate results after each event.
 42     */
 43     public void display() {}
 44  
 45     /**
 46        Displays summary results after the end of the simulation.
 47     */
 48     public void displaySummary() {}
 49  
 50     public void run(double startTime, double endTime)
 51     {
 52        currentTime = startTime;
 53  
 54        while (eventQueue.size() > 0 && currentTime <= endTime)
 55        { 
 56           Event event = eventQueue.remove();
 57           currentTime = event.getTime();
 58           event.process(this);
 59           display();
 60        }
 61        displaySummary();
 62     }
 63  }