当前位置: 首页 > 面试题库 >

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

裴学
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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



 类似资料:
  • 我现在根据我的算法更改任务优先级,我想将这些任务交给虚拟机,我如何在cloudsim中完成?

  • 我使用java.util.concurrent.ExecutorService和固定线程池来执行任务列表。我的任务列表通常在80-150个左右,我已经将任何时候运行的线程数限制为10个,如下所示: 我的用例要求即使完成的任务也应该重新提交给ExecutorService,但是只有当所有已经提交的任务都被服务/完成时,才应该再次执行/获取。也就是说,提交的任务基本上应该轮流执行。因此,在这种情况下不

  • 我已经使用ExecutorService实现了超时任务。在下面的方法中,我正在提交超时任务,如果它在给定的时间内超时,我将取消该任务并关闭执行器。 它运行得很好,我没有任何问题。 然而,我想知道这是否是最好的代码设计。我只是想知道如果使用ExecutorService返回的未来是否会更好。submit()获取可调用函数的返回值或超时超时任务。例如 我正在使用JDK7。

  • 问题内容: 我有三个连接的线程,即第二个线程在第一个死后执行。 这是我的代码: 我将如何使用而不是三个线程对象来实现此功能? 问题答案: 如果您想要/需要的是一个接一个地执行一组作业,但要在与主应用程序线程不同的单个线程中执行,请使用。

  • 使用优先队列实现 Stride Scheduling 在上述的实现描述中,对于每一次pick_next函数,我们都需要完整地扫描来获得当前最小的stride及其进程。这在进程非常多的时候是非常耗时和低效的,有兴趣的同学可以在实现了基于列表扫描的Stride调度器之后比较一下priority程序在Round-Robin及Stride调度器下各自的运行时间。考虑到其调度选择于优先队列的抽象逻辑一致,我