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<ReadTask> 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();
|
|
}
|
|
}
|
|
}
|
|
}
|