我有一个使用LinkedBlockingDequeue构建的ThreadPoolExecutor,我想操纵底层队列,但是在文档中阅读这个让我非常紧张。
队列维护
方法getQueue()允许访问工作队列以进行监视和调试。强烈建议不要将此方法用于任何其他目的。当大量排队的任务被取消时,两个提供的方法remove(java.lang.Runnable)和purge()可用于协助存储回收。
具体来说我希望能够
由于
答案 0 :(得分:4)
getQueue()
将始终返回您传递到BlockingQueue<Runnable>
的确切ThreadPoolExecutor
。
对文档的担心是,如果您无法保证BlockingQueue
的线程安全,则可能很容易遇到双重运行的问题。如果您使用PriorityBlockingQueue
,并且仅使用remove
和add
(或者更直接地使用offer
),那么您将是安全的,甚至可以直接执行来自getQueue()
。
换句话说,只要您的信号告诉您某些Runnable
的优先级已更改,那么您应该remove
它并检查删除的结果(true
,如果已删除) ,并且只有在实际删除它时,您应该重新添加它。您无法保证在这些操作之间无法获取某些内容,但至少可以保证您不会重复运行Runnable
,如果使用contains
完成,则很容易发生这种情况 - &gt ; remove
- &gt; add
。
或者,您可以编写自己的BlockingQueue
实现,该Comparator
使用PriorityBlockingQueue
(如{{1}}),只要有新数据,就会找到最高优先级。考虑到所涉及的各种界面,这听起来更多。