TaskSchedular のマルチスレッド バージョンを作成する必要があります。
TaskScheduler {
TaskScheduler(List<Task> tasks)
....
}
interface Task {
int getPriority()
void execute()
}
これにより、優先度の高いタスクが優先度の低いタスクの後に実行を開始しないことが保証されます。
これが私のシングルスレッドバージョンの例です。このマルチスレッドを作成する必要があります。
public class SingleThreadedTaskScheduler {
private ExecutorService executorService = Executors.newFixedThreadPool(1);
private PriorityQueue<Task> taskQueue;
private static final PriorityComparator PRIORITY_COMPARATOR = new PriorityComparator();
public SingleThreadedTaskScheduler(List<Task> tasks){
this.taskQueue = new PriorityQueue<Task>(tasks.size(), PRIORITY_COMPARATOR);
this.taskQueue.addAll(tasks);
}
public void executeAllByPriority(){
executorService.submit(new Runnable() {
@Override
public void run() {
for (Task task : taskQueue) {
task.execute();
}
}
});
}
public void executeAllByPriorityWithUnInterruptableFirst(){
executorService.submit(new Runnable() {
@Override
public void run() {
PriorityQueue<Task> interruptedQueue = new PriorityQueue<Task>(taskQueue.size(),PRIORITY_COMPARATOR);
for (Task task : taskQueue) {
if (task instanceof Interruptible && ((Interruptible) task).isInterrupted() ){
interruptedQueue.add(task);
} else {
task.execute();
}
}
for (Task task : interruptedQueue ){
task.execute();
}
}
});
}
@Override
protected void finalize() throws Throwable {
super.finalize();
executorService.shutdown();
}
}
小さなコードが大いに役立ちます。