import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class TaskQueue {
private Queue<Task> queue = new LinkedList<Task>();
private Task currentTask = createEmptyTask();
private synchronized Task createEmptyTask() {
return new Task(Task.Status.FINISHED, Task.Type.EMPTY);
}
public synchronized void addTask(Task task) {
if (task != null) {
queue.offer(task);
if (Task.Type.EMPTY == currentTask.getType()) {
startNextTask();
}
}
}
public synchronized void finishTask(Task task) {
if (task != null) {
task.setStatus(Task.Status.FINISHED);
queue.remove(task);
if (task.equals(currentTask)) {
startNextTask();
}
}
}
public synchronized void finishTask(String taskId) {
Task task = getTask(taskId);
finishTask(task);
}
public synchronized void finishCurrentTask() {
finishTask(currentTask);
}
public synchronized Task getTask(String taskId) {
Iterator<Task> iter = queue.iterator();
while (iter.hasNext()) {
Task task = iter.next();
if (task.getTaskId().equals(taskId)) {
return task;
}
}
return null;
}
public synchronized Task peekTask() {
return queue.peek();
}
public synchronized Task pollTask() {
return queue.poll();
}
public Task getCurrentTask() {
return currentTask;
}
private synchronized void startNextTask() {
if (Task.Status.FINISHED == currentTask.getStatus()) {
currentTask = peekTask();
if (currentTask != null && Task.Status.NEW == currentTask.getStatus()) {
currentTask.setStatus(Task.Status.RUNNING);
currentTask.start();
} else {
currentTask = createEmptyTask();
}
}
}
public static TaskQueue taskQueue = new TaskQueue();
public static void main(String[] args) {
Task task = new Task(String.valueOf(0));
taskQueue.addTask(task);
taskQueue.finishTask(String.valueOf(0));
}
}
public class Task extends Thread{
private String taskId;
private String data;
private Type type = Type.NORMAL;
private Status status = Status.NEW;
public enum Type{EMPTY, NORMAL};
public enum Status{NEW, RUNNING, FINISHED};
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public Task(String taskId) {
this.taskId = taskId;
}
public Task(Status status) {
this.status = status;
}
public Task(Status status, Type type) {
this.status = status;
this.setType(type);
}
public Task(String taskId, String data) {
this.taskId = taskId;
this.data = data;
}
@Override
public int hashCode() {
return taskId.hashCode();
}
@Override
public boolean equals(Object o) {
Task t = (Task) o;
if (t.getTaskId().equals(this.getTaskId())){
return true;
} else {
return false;
}
}
@Override
public void run() {
try {
System.out.println("Task [" + taskId + "] runing");
sleep(1000);
TaskQueue.taskQueue.finishTask(this.getTaskId());
} catch (Exception e) {
e.printStackTrace();
}
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}