package net.jrtechs; import java.util.*; import java.util.concurrent.ConcurrentSkipListSet; import java.util.stream.Collectors; import java.util.stream.IntStream; public class Manager extends ParallelExecutor { /** Number of threads to use at once */ private final int threadCount; public Manager(int threadCount) { this.threadCount = threadCount; } /** * This is the fun method. * * This will run all of the tasks in parallel using the * desired amount of threads until all of the jobs are * complete. * @return * @param tasks */ public List runTasks(Vector> tasks) { List results = new Vector<>(); Queue taskQueue = new LinkedList<>(); taskQueue.addAll(IntStream.range(0, tasks.size()) .boxed().collect(Collectors.toList())); int desiredThreads = Math.min(threadCount, tasks.size()); Thread[] runners = new Thread[desiredThreads]; for(int i = 0; i < desiredThreads; i++) { runners[i] = new Thread(()-> { Work t; while(true) { Integer nextTask; synchronized (taskQueue) { nextTask = taskQueue.poll(); } if(nextTask == null) return; results.add(tasks.get(nextTask).runTask()); } }); runners[i].start(); } for(Thread t: runners) { try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } return results; } }