在Java的ThreadPoolExecutor中重新排序队列

Jon*_*Jon 8 java multithreading

可能重复:
Java执行器:如何设置任务优先级?

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

队列维护

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

具体来说,我希望能够

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

谢谢

pic*_*ypg 4

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

文档的担忧是,如果不能保证BlockingQueue. 如果你使用PriorityBlockingQueue, 并且只使用removeand add(或者更直接地,offer),那么你将是安全的,你甚至可以直接从getQueue().

换句话说,每当您的信号告诉您 someRunnable的优先级已更改时,您就应该remove检查删除的结果(true如果已删除),并且只有当它确实被删除时,您才应该重新添加它。您不能保证在这些操作之间不会拾取某些内容,但至少可以保证您不会重复运行,如果使用-> ->Runnable完成,则很容易发生这种情况。containsremoveadd

或者,您也可以编写自己的 a 实现BlockingQueue,该实现使用 a Comparator(如PriorityBlockingQueue),每当请求新数据时都会找到最高优先级。考虑到涉及的各种接口,这听起来需要做更多的工作。