From 4e760733b56f5a60ba9c34a58b54899df2931ac4 Mon Sep 17 00:00:00 2001 From: plaa Date: Mon, 9 Apr 2012 07:51:42 +0000 Subject: [PATCH] Fix bug in simulation runner ThreadPoolExecutor git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@529 180e2498-e6e9-4542-8430-84ac67f01cd8 --- core/ChangeLog | 4 +++ .../gui/main/SimulationRunDialog.java | 31 ++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/core/ChangeLog b/core/ChangeLog index 34b1d895..f20dcc32 100644 --- a/core/ChangeLog +++ b/core/ChangeLog @@ -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 diff --git a/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java b/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java index f85b248f..3b170d42 100644 --- a/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java +++ b/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java @@ -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(), + 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(); } -- 2.30.2