package bsearch.nlogolink; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import bsearch.nlogolink.ModelRunner.Factory; import bsearch.nlogolink.ModelRunner.ModelRunnerException; public class BatchRunner { private ModelRunner.Factory factory; ExecutorService pool; private final int numThreads; public BatchRunner(int numThreads, Factory factory) { this.factory = factory; this.numThreads = numThreads; pool = java.util.concurrent.Executors.newFixedThreadPool(numThreads); } public int getNumThreads() { return numThreads; } public List<ModelRunResult> doBatchRun(List<ModelRunner.RunSetup> setups) throws NetLogoLinkException, ModelRunnerException, InterruptedException { ArrayList<ModelRunnerTask> tasks = new ArrayList<ModelRunnerTask>(); for (ModelRunner.RunSetup setup: setups) { tasks.add(new ModelRunnerTask(factory, setup)); } List<Future<ModelRunResult>> futures = new ArrayList<Future<ModelRunResult>>(tasks.size()); List<ModelRunResult> results = new ArrayList<ModelRunResult>(tasks.size()); try { for (ModelRunnerTask task : tasks) { futures.add(pool.submit(task)); } for (Future<ModelRunResult> future : futures) { results.add(future.get()); } return results; } catch (ExecutionException ex) { if (ex.getCause() instanceof NetLogoLinkException) { throw (NetLogoLinkException) ex.getCause(); } else if (ex.getCause() instanceof ModelRunnerException) { throw (ModelRunnerException) ex.getCause(); } else { ex.printStackTrace(); throw new NetLogoLinkException("Unexpected exception while attempting to run NetLogo", ex); } } } public void dispose() throws InterruptedException { pool.shutdownNow(); factory.disposeAllRunners(); } }