]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThread.java
Wake DynamicExperimentThread task runner up when state changes
[simantics/platform.git] / bundles / org.simantics.simulator.toolkit / src / org / simantics / simulator / toolkit / DynamicExperimentThread.java
index 0967bfdbc28d19c3e5b69eae0980128fa296ad92..bff9fe751b666455b8c9655ad3b59e93fe807c98 100644 (file)
@@ -138,10 +138,12 @@ abstract public class DynamicExperimentThread extends Thread {
 
                                                if(deltaNs > 0) {
                                                        synchronized(tasks) {
-                                                               try {
-                                                                       tasks.wait(deltaMs, deltaNsRem);
-                                                               } catch (InterruptedException e) {
-                                                                       e.printStackTrace();
+                                                               if (inState(StandardExperimentStates.Running.class)) {
+                                                                       try {
+                                                                               tasks.wait(deltaMs, deltaNsRem);
+                                                                       } catch (InterruptedException e) {
+                                                                               LOGGER.warn("Dynamic experiment thread '" + this.getName() + "' (" + this.getClass().getName() + ") interrupted", e);
+                                                                       }
                                                                }
                                                        }
                                                }
@@ -158,7 +160,7 @@ abstract public class DynamicExperimentThread extends Thread {
                                                        try {
                                                                tasks.wait(Integer.MAX_VALUE);
                                                        } catch (InterruptedException e) {
-                                                               e.printStackTrace();
+                                                               LOGGER.warn("Dynamic experiment thread '" + this.getName() + "' (" + this.getClass().getName() + ") interrupted", e);
                                                        }
                                                }
                                        }
@@ -188,7 +190,7 @@ abstract public class DynamicExperimentThread extends Thread {
        };
 
        public int runTasks() {
-               ArrayList<Runnable> todo = new ArrayList<>();
+               ArrayList<Runnable> todo = new ArrayList<>(tasks.size());
                synchronized(tasks) {
                        todo.addAll(tasks);
                        tasks.clear();
@@ -271,6 +273,9 @@ abstract public class DynamicExperimentThread extends Thread {
        public void changeState(ExperimentState state) {
                this.state = state;
                fireStateChanged(state);
+               synchronized (tasks) {
+                       tasks.notifyAll();
+               }
        }
 
        public void addListener(DynamicExperimentThreadListener listener) {