一尘不染

如何在Java 5中使用ExecutorService实现任务优先级?

java

我正在实现一个线程池机制,在该机制中我想执行具有不同优先级的任务。我希望有一个很好的机制,通过该机制,我可以向服务提交高优先级的任务,并将其安排在其他任务之前。任务的优先级是任务本身的固有属性(无论我对a
Callable还是a 表示任务Runnable对我来说都不重要)。

现在,从表面上看,我可以在中使用a
PriorityBlockingQueue作为任务队列ThreadPoolExecutor,但是该队列包含Runnable对象,这些对象可能是也可能不是Runnable我提交给它的任务。而且,如果我已经提交了Callable任务,则不清楚如何映射。

有没有办法做到这一点?我真的不愿意为此付出自己的努力,因为那样的话我更容易出错。

(顺便说一句,是的,我知道在这样的情况下,低优先级工作可能会挨饿。加分(?!)对于可以合理保证公平的解决方案)


阅读 362

收藏
2020-09-08

共1个答案

一尘不染

乍一看,您似乎可以为扩展RunnableCallable<T>和的任务定义接口Comparable。然后将a打包为ThreadPoolExecutor一个PriorityBlockingQueue队列,并且仅接受实现您的接口的任务。

考虑到您的评论后,似乎可以选择一种方法来扩展ThreadPoolExecutor,并覆盖submit()方法。请参阅以AbstractExecutorService查看默认值。他们做的是包裹Runnable还是CallableFutureTaskexecute()它。我可能会通过编写一个实现ExecutorService并委托给匿名inner内部的包装器类来实现ThreadPoolExecutor。将它们包裹在您优先考虑的东西中,以便您Comparator可以使用它。

2020-09-08