我希望为自定义Executor
实现以下API:
public interface PriorityExecutor extends ExecutorService {
<T> Future<T> submit(Callable<T> task, int priority);
}
这背后的想法是PriorityExecutor
将接收具有不同优先级的Callable
个对象,并将在单个线程中首先执行最高优先级的项目。
以下类用作Callable和priority的包装器:
class PriorityFutureTask<T> extends FutureTask<T> {
private int priority;
PriorityFutureTask(Callable<T> callable, int priority) {
super(callable);
this.priority = priority;
}
}
以下比较器被赋予PriorityBlockingQueue:
private class PriorityFutureTaskComparator<T extends PriorityFutureTask> implements Comparator<T> {
@Override
public int compare(T t1, T t2) {
return t2.getPriority() - t1.getPriority();
}
}
到目前为止,PriorityBlockingQueue
在添加项目时的行为与预期一致。
如果我不关心提交返回的Future对象的结果,那么从队列中处理优先级最高的项目直到没有剩下的对象是非常容易的。
但是,我还没有想出如何在PriorityFutureTasks
中执行PriorityExecutor
,以便考虑优先级,并且调用者可以从Future返回的结果中获取结果。 submit()