/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/
package org.digidoc4j.impl.bdoc.xades.validation;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.digidoc4j.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ThreadPoolManager {
private final static Logger logger = LoggerFactory.getLogger(ThreadPoolManager.class);
private static ExecutorService defaultThreadExecutor;
private Configuration configuration;
public ThreadPoolManager(Configuration configuration) {
this.configuration = configuration;
}
public static void setDefaultThreadExecutor(ExecutorService threadExecutor) {
ThreadPoolManager.defaultThreadExecutor = threadExecutor;
}
public ExecutorService getThreadExecutor() {
if (configuration.getThreadExecutor() != null) {
return configuration.getThreadExecutor();
}
if (defaultThreadExecutor == null) {
initializeDefaultThreadExecutor();
}
return defaultThreadExecutor;
}
private static synchronized void initializeDefaultThreadExecutor() {
//Using double-checked locking to avoid other threads to start initializing another executor
if (defaultThreadExecutor == null) {
int numberOfProcessors = Runtime.getRuntime().availableProcessors();
logger.debug("Initializing a new default thread pool executor with " + numberOfProcessors + " threads");
defaultThreadExecutor = Executors.newFixedThreadPool(numberOfProcessors);
}
}
public <T> Future<T> submit(Callable<T> task) {
return getThreadExecutor().submit(task);
}
}