package edu.stanford.nlp.semparse.open.util;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import fig.basic.LogInfo;
import fig.basic.Option;
public class Parallelizer {
public static class Options {
@Option(gloss = "Number of threads for execution")
public int numThreads = 1;
}
public static Options opts = new Options();
public static int getNumThreads() {
int numThreads = Runtime.getRuntime().availableProcessors();
if (opts.numThreads > 0 && numThreads > opts.numThreads)
numThreads = opts.numThreads;
return numThreads;
}
public static void run(List<Runnable> tasks) {
LogInfo.begin_threads();
ExecutorService service = Executors.newFixedThreadPool(getNumThreads());
try {
for (Runnable task : tasks) {
service.submit(task);
}
service.shutdown();
service.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
LogInfo.fail(e);
}
LogInfo.end_threads();
}
public static <T, S extends Callable<T>> List<Future<T>> runAndReturnStuff(List<S> tasks) {
LogInfo.begin_threads();
List<Future<T>> results = null;
ExecutorService service = Executors.newFixedThreadPool(getNumThreads());
try {
// Invoke all trainers
results = service.invokeAll(tasks);
service.shutdown();
service.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
LogInfo.fail(e);
}
LogInfo.end_threads();
return results;
}
}