package org.softlang.company.features.context;
import org.softlang.company.features.action.Action;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* Run an action via submission to thread pool, i.e., concurrently
*/
public class ConcurrentContext implements Context {
private static final int POOL_SIZE = 7;
private ExecutorService pool;
public ConcurrentContext() {
pool = Executors.newFixedThreadPool(POOL_SIZE);
}
public synchronized <X, Y> void execute(final Action<X, Y> action,
final X param) {
final ConcurrentContext context = this;
pool.submit(new Runnable() {
public void run() {
action.execute(context, param);
}
});
}
public void waitForTermination() {
try {
pool.awaitTermination(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}