//: net/mindview/util/TaskManager.java
// Managing and executing a queue of tasks.
package net.mindview.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TaskManager<R, C extends Callable<R>> extends
ArrayList<TaskItem<R, C>> {
private ExecutorService exec = Executors.newSingleThreadExecutor();
public void add(C task) {
add(new TaskItem<R, C>(exec.submit(task), task));
}
public List<R> getResults() {
Iterator<TaskItem<R, C>> items = iterator();
List<R> results = new ArrayList<R>();
while (items.hasNext()) {
TaskItem<R, C> item = items.next();
if (item.future.isDone()) {
try {
results.add(item.future.get());
} catch (Exception e) {
throw new RuntimeException(e);
}
items.remove();
}
}
return results;
}
public List<String> purge() {
Iterator<TaskItem<R, C>> items = iterator();
List<String> results = new ArrayList<String>();
while (items.hasNext()) {
TaskItem<R, C> item = items.next();
// Leave completed tasks for results reporting:
if (!item.future.isDone()) {
results.add("Cancelling " + item.task);
item.future.cancel(true); // May interrupt
items.remove();
}
}
return results;
}
} // /:~