在Java ThreadPoolExecutor中重新排序队列

时间:2012-09-20 17:55:57

标签: java multithreading

  

可能重复:
  Java Executors: how can I set task priority?

我有一个使用LinkedBlockingDequeue构建的ThreadPoolExecutor,我想操纵底层队列,但是在文档中阅读这个让我非常紧张。

  

队列维护

     

方法getQueue()允许访问工作队列以进行监视和调试。强烈建议不要将此方法用于任何其他目的。当大量排队的任务被取消时,两个提供的方法remove(java.lang.Runnable)和purge()可用于协助存储回收。

具体来说我希望能够

  1. 检查队列以查看元素是否已存在。我认为这很好,因为只需查看队列中的元素就不需要锁定。
  2. 我想根据一些信号重新排序队列。这显然很麻烦。我想知道是否有一种首选的方法可以做到这一点,这样我就不会把队列搞得其他用了。
  3. 由于

1 个答案:

答案 0 :(得分:4)

getQueue()将始终返回您传递到BlockingQueue<Runnable>的确切ThreadPoolExecutor

对文档的担心是,如果您无法保证BlockingQueue的线程安全,则可能很容易遇到双重运行的问题。如果您使用PriorityBlockingQueue,并且仅使用removeadd(或者更直接地使用offer),那么您将是安全的,甚至可以直接执行来自getQueue()

换句话说,只要您的信号告诉您某些Runnable的优先级已更改,那么您应该remove它并检查删除的结果(true,如果已删除) ,并且只有在实际删除它时,您应该重新添加它。您无法保证在这些操作之间无法获取某些内容,但至少可以保证您不会重复运行Runnable,如果使用contains完成,则很容易发生这种情况 - &gt ; remove - &gt; add

或者,您可以编写自己的BlockingQueue实现,该Comparator使用PriorityBlockingQueue(如{{1}}),只要有新数据,就会找到最高优先级。考虑到所涉及的各种界面,这听起来更多。