import java.util.List; import java.util.Vector; /** * A class which enables user to run a large chunk of * tasks in parallel efficiently. * * @author Jeffery 1-29-19 */ public class TaskManager { /** Number of threads to use at once */ private int threadCount; /** Meaningless tasks to run in parallel */ private List tasks; public TaskManager(int threadCount) { this.threadCount = threadCount; //using vectors because they are thread safe this.tasks = new Vector<>(); } public void addTask(ReadTask t) { tasks.add(t); } /** * This is the fun method. * * This will run all of the tasks in parallel using the * desired amount of threads untill all of the jobs are * complete. */ public void runTasks() { int desiredThreads = threadCount > tasks.size() ? tasks.size() : threadCount; Thread[] runners = new Thread[desiredThreads]; for(int i = 0; i < desiredThreads; i++) { runners[i] = new Thread(()-> { ReadTask t = null; while(true) { //need synchronized block to prevent //race condition synchronized (tasks) { if(!tasks.isEmpty()) t = tasks.remove(0); } if(t == null) { break; } else { t.runTask(); t = null; } } }); runners[i].start(); } for(int i = 0; i < desiredThreads; i++) { try { runners[i].join(); } catch (Exception e) { e.printStackTrace(); } } } }