TaskManager
This class responsible for process givin tasks in queue.Use addTask() method to add task to queue
Use can spacify the number of concurent job by setMaxConcurentJob(integer)
package taskmanager;
public class TaskManagerimplements Runnable
{
private java.util.Vector<TaskBase > queue= new java.util.Vector<TaskBase >();
private int maxConcurrentJob = 1;
private int currentJobNumber = 0;
private boolean process = false;
public TaskManager()
{
}
/**
*
* @param maxConcurrentJob Number of concurrent tasks
*/
public TaskManager(int maxConcurrentJob)
{
this.maxConcurrentJob = maxConcurrentJob;
}
public void startProcessingQuee()
{
if (!process)
{
process = true;
Thread t = new Thread(this);
t.setDaemon(true);
t.start();
}
}
public void stop()
{
process = false;
queue.clear();
}
public void setMaxConcurentJob(int maxConcurentJob)
{
this.maxConcurrentJob = maxConcurentJob;
}
public void addTask(TaskBase ct)
{
ct.setTaskManager(this);
queue.add(ct);
}
public void taskFinished(CacheTask ct)
{
currentJobNumber--;
}
@Override
public void run()
{
while (process)
{
if (queue.size() > 0)
{
if (currentJobNumber < maxConcurrentJob)
{
currentJobNumber++;
queue.get(0).start();
queue.remove(0);
}
}
}
}
}
TaskBase
By inheriting this class you can define your custom task by overriding processTask() method.
For example: i used this class to cache smaller instance of image on hard disk in PicFX application.
package taskmanager;
import taskmanager.TaskManager;
public abstract class TaskBase implements Runnable
{
private TaskManager taskManager;
public void setTaskManager(TaskManagertaskManager)
{
this.taskManager= taskManager;
}
public void start()
{
Thread t = new Thread(this);
t.setDaemon(true);
t.start();
}
protected abstract void processTask();
@Override
public void run()
{
try
{
processTask();
} finally
{
cacheManager.taskFinished(this);
}
}
}
No comments:
Post a Comment