我已经以合理的方式解决了这个问题,我将在下面描述它,以供将来参考我自己和任何遇到Java Concurrent库问题的人。
使用 a 作为坚持任务以便以后执行的手段,确实是朝着正确方向前进的举动。问题在于,必须一般地实例化以包含实例,并且不可能在接口上调用(或类似)。PriorityBlockingQueue
PriorityBlockingQueue
Runnable
compareTo
Runnable
解决问题。创建执行器时,必须为其指定一个 .应进一步为队列提供一个自定义比较器,以执行正确的就地排序:PriorityBlockingQueue
new PriorityBlockingQueue<Runnable>(size, new CustomTaskComparator());
现在,看一看:CustomTaskComparator
public class CustomTaskComparator implements Comparator<MyType> {
@Override
public int compare(MyType first, MyType second) {
return comparison;
}
}
到目前为止,一切看起来都很直接。这里有点粘。我们的下一个问题是处理执行器创建的未来任务。在执行器中,我们必须这样覆盖:newTaskFor
@Override
protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
//Override the default FutureTask creation and retrofit it with
//a custom task. This is done so that prioritization can be accomplished.
return new CustomFutureTask(c);
}
我们尝试执行的任务在哪里。现在,让我们来看看:c
Callable
CustomFutureTask
public class CustomFutureTask extends FutureTask {
private CustomTask task;
public CustomFutureTask(Callable callable) {
super(callable);
this.task = (CustomTask) callable;
}
public CustomTask getTask() {
return task;
}
}
请注意该方法。我们稍后将使用它从我们创建的这个任务中获取原始任务。getTask
CustomFutureTask
最后,让我们修改我们尝试执行的原始任务:
public class CustomTask implements Callable<MyType>, Comparable<CustomTask> {
private final MyType myType;
public CustomTask(MyType myType) {
this.myType = myType;
}
@Override
public MyType call() {
//Do some things, return something for FutureTask implementation of `call`.
return myType;
}
@Override
public int compareTo(MyType task2) {
return new CustomTaskComparator().compare(this.myType, task2.myType);
}
}
您可以看到,我们在任务中实现将 委托给实际的 .Comparable
Comparator
MyType
你有它,使用Java库为执行器自定义优先级!这需要一些弯曲,但它是我能够想到的最干净的。我希望这对某人有帮助!