From e11bce7ad3e803e80883499fec0ad6e4540ffe43 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 30 Jun 2020 18:03:48 +0200 Subject: Add modified VIATRA-DSE version --- .../viatra/dse/multithreading/DSEThreadPool.java | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/multithreading/DSEThreadPool.java (limited to 'Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/multithreading/DSEThreadPool.java') diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/multithreading/DSEThreadPool.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/multithreading/DSEThreadPool.java new file mode 100644 index 00000000..17e96a75 --- /dev/null +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/multithreading/DSEThreadPool.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2010-2014, Miklos Foldenyi, Andras Szabolcs Nagy, Abel Hegedus, Akos Horvath, Zoltan Ujhelyi and Daniel Varro + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-v20.html. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.viatra.dse.multithreading; + +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.eclipse.viatra.dse.api.DesignSpaceExplorer; +import org.eclipse.viatra.dse.base.ExplorerThread; + +/** + * + * @author Andras Szabolcs Nagy + * + */ +public class DSEThreadPool extends ThreadPoolExecutor { + + private static final long THREAD_KEEP_ALIVE_IN_SECONDS = 60; + + public DSEThreadPool() { + // Based on the Executors.newCachedThreadPool() + super(0, getProcNumber(), THREAD_KEEP_ALIVE_IN_SECONDS, TimeUnit.SECONDS, new SynchronousQueue()); + } + + // helper for constructor + private static int getProcNumber() { + return Runtime.getRuntime().availableProcessors(); + } + + public boolean tryStartNewStrategy(ExplorerThread strategy) { + + if (!canStartNewThread()) { + return false; + } + + try { + submit(strategy); + } catch (RejectedExecutionException e) { + Logger.getLogger(DesignSpaceExplorer.class).info("Couldn't start new thread.", e); + return false; + } + + return true; + } + + public boolean canStartNewThread() { + return getMaximumPoolSize() > getActiveCount(); + } +} -- cgit v1.2.3-54-g00ecf