我正在实现一个线程池机制,在该机制中我想执行具有不同优先级的任务。我希望有一个很好的机制,通过该机制,我可以向服务提交高优先级的任务,并将其安排在其他任务之前。任务的优先级是任务本身的固有属性(无论我对a Callable还是a 表示任务Runnable对我来说都不重要)。
Callable
Runnable
现在,从表面上看,我可以在中使用a PriorityBlockingQueue作为任务队列ThreadPoolExecutor,但是该队列包含Runnable对象,这些对象可能是也可能不是Runnable我提交给它的任务。而且,如果我已经提交了Callable任务,则不清楚如何映射。
PriorityBlockingQueue
ThreadPoolExecutor
有没有办法做到这一点?我真的不愿意为此付出自己的努力,因为那样的话我更容易出错。
(顺便说一句,是的,我知道在这样的情况下,低优先级工作可能会挨饿。加分(?!)对于可以合理保证公平的解决方案)
乍一看,您似乎可以为扩展Runnable或Callable<T>和的任务定义接口Comparable。然后将a打包为ThreadPoolExecutor一个PriorityBlockingQueue队列,并且仅接受实现您的接口的任务。
Callable<T>
Comparable
考虑到您的评论后,似乎可以选择一种方法来扩展ThreadPoolExecutor,并覆盖submit()方法。请参阅以AbstractExecutorService查看默认值。他们做的是包裹Runnable还是Callable在FutureTask和execute()它。我可能会通过编写一个实现ExecutorService并委托给匿名inner内部的包装器类来实现ThreadPoolExecutor。将它们包裹在您优先考虑的东西中,以便您Comparator可以使用它。
submit()
AbstractExecutorService
FutureTask
execute()
ExecutorService
Comparator