Fix bug in simulation runner ThreadPoolExecutor
authorplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 9 Apr 2012 07:51:42 +0000 (07:51 +0000)
committerplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 9 Apr 2012 07:51:42 +0000 (07:51 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@529 180e2498-e6e9-4542-8430-84ac67f01cd8

core/ChangeLog
core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java

index 34b1d8956583e3d60c017071b780e15c17a6aa53..f20dcc32da75358223a9faff96e5616b80700f2a 100644 (file)
@@ -1,3 +1,7 @@
+2012-04-09  Sampo Niskanen
+
+       * [BUG] Cancelling simulation causes later simulations to fail
+
 2012-03-27  Sampo Niskanen
 
        * [BUG] Inputting negative rotation angle values of components
index f85b248f640367a37df394fe710cabeef884e2d9..3b170d421aa41030473bd56e086b156a18a4f8cf 100644 (file)
@@ -10,8 +10,11 @@ import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.util.Iterator;
 import java.util.List;
-import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 import javax.swing.JButton;
 import javax.swing.JDialog;
@@ -58,8 +61,28 @@ public class SimulationRunDialog extends JDialog {
        private static final double APOGEE_PROGRESS = 0.7;
        
        
-       private final static ExecutorService executor = Executors.newFixedThreadPool(
-                       SwingPreferences.getMaxThreadCount());
+       /**
+        * A single ThreadPoolExecutor that will be used for all simulations.
+        * This executor must not be shut down.
+        */
+       private static final ThreadPoolExecutor executor;
+       static {
+               int n = SwingPreferences.getMaxThreadCount();
+               executor = new ThreadPoolExecutor(n, n,
+                               0L, TimeUnit.MILLISECONDS,
+                               new LinkedBlockingQueue<Runnable>(),
+                               new ThreadFactory() {
+                                       private ThreadFactory factory = Executors.defaultThreadFactory();
+                                       
+                                       @Override
+                                       public Thread newThread(Runnable r) {
+                                               Thread t = factory.newThread(r);
+                                               t.setDaemon(true);
+                                               return t;
+                                       }
+                               });
+       }
+       
        
        
        private final JLabel simLabel, timeLabel, altLabel, velLabel;
@@ -172,10 +195,10 @@ public class SimulationRunDialog extends JDialog {
         * the Cancel button on the dialog.
         */
        public void cancelSimulations() {
-               executor.shutdownNow();
                for (SimulationWorker w : simulationWorkers) {
                        w.cancel(true);
                }
+               executor.purge();
        }