21 package org.matsim.core.mobsim.qsim.qnetsimengine;
23 import java.util.Iterator;
24 import java.util.LinkedList;
25 import java.util.List;
26 import java.util.ListIterator;
27 import java.util.Queue;
28 import java.util.concurrent.ConcurrentLinkedQueue;
41 private double time = 0.0;
51 private final Queue<QNodeI> nodesQueue =
new ConcurrentLinkedQueue<>();
59 private final List<QLinkI> linksList =
new LinkedList<>();
70 private boolean lockNodes =
false;
71 private boolean lockLinks =
false;
74 private long startTime = 0;
76 if (QSim.analyzeRunTimes) runTimes =
new long[QNetsimEngineWithThreadpool.numObservedTimeSteps];
80 final void setTime(
final double t) {
84 public abstract void afterSim() ;
86 protected void moveNodes() {
87 boolean remainsActive;
88 this.lockNodes =
true;
90 Iterator<QNodeI> simNodes = this.nodesQueue.iterator();
91 while (simNodes.hasNext()) {
92 node = simNodes.next();
93 remainsActive = node.doSimStep(time);
94 if (!remainsActive) simNodes.remove();
96 this.lockNodes =
false;
99 protected final void moveLinks() {
100 boolean remainsActive;
103 ListIterator<QLinkI> simLinks = this.linksList.listIterator();
104 while (simLinks.hasNext()) {
105 link = simLinks.next();
107 remainsActive = link.doSimStep();
109 if (!remainsActive) simLinks.remove();
120 protected final void registerLinkAsActive(QLinkI link) {
121 if (!lockLinks) linksList.add(link);
122 else throw new RuntimeException(
"Tried to activate a QLink at a time where this was not allowed. Aborting!");
126 public final int getNumberOfSimulatedLinks() {
127 return this.linksList.size();
136 protected final void registerNodeAsActive(QNodeI node) {
137 if (!this.lockNodes) this.nodesQueue.add(node);
138 else throw new RuntimeException(
"Tried to activate a QNode at a time where this was not allowed. Aborting!");
148 public final int getNumberOfSimulatedNodes() {
149 return this.nodesQueue.size();
152 protected final void startMeasure() {
153 if (QSim.analyzeRunTimes) this.startTime = System.nanoTime();
156 protected final void endMeasure() {
157 if (QSim.analyzeRunTimes) {
158 long end = System.nanoTime();
159 int bin = (int) this.time;
160 if (bin < this.runTimes.length) this.runTimes[bin] = end - this.startTime;