package net.jrtechs; import java.util.ArrayList; import java.util.List; import java.util.Vector; import java.util.concurrent.*; import java.util.stream.Collectors; public class ThreadPoolExecutor extends ParallelExecutor { @Override public List runTasks(Vector> tasks) { ExecutorService executor = Executors.newCachedThreadPool(); List> callables = new ArrayList>(); for(Work work: tasks) { Callable c = new Callable() { @Override public E call() throws Exception { return work.runTask(); } }; callables.add(c); } List results = new ArrayList<>(); try { List> futures = executor.invokeAll(callables); for(Future future: futures) { try { results.add(future.get()); } catch (ExecutionException e) { e.printStackTrace(); } } } catch (InterruptedException e) { e.printStackTrace(); } return results; } }