java - 在 Java 的 ThreadPoolExecutor 中重新排序队列

标签 java multithreading

<分区>

Possible Duplicate:
Java Executors: how can I set task priority?

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

Queue maintenance

Method getQueue() allows access to the work queue for purposes of monitoring and debugging. Use of this method for any other purpose is strongly discouraged. Two supplied methods, remove(java.lang.Runnable) and purge() are available to assist in storage reclamation when large numbers of queued tasks become cancelled.

特别是我希望能够

  1. 检查队列以查看元素是否已存在。我认为这很好,因为不需要锁定就可以查看队列中的元素。
  2. 我想根据一些信号对队列重新排序。这显然很麻烦。我想知道是否有更好的方法来执行此操作,这样我就不会弄乱队列用于其他用途。

谢谢

最佳答案

getQueue()将始终返回准确的 BlockingQueue<Runnable>你传递给ThreadPoolExecutor .

文档令人担心的是,如果您不能保证 BlockingQueue 的线程安全,您很容易遇到双重运行问题。 .如果您使用 PriorityBlockingQueue , 并且只使用 removeadd (或者更直接地说,offer),那么你就安全了,你甚至可以直接从 getQueue() .

换句话说,每当你的信号告诉你一些Runnable的优先级已经改变,那么你应该remove它并检查删除的结果( true 如果删除),只有当它实际被删除时,您才应该重新添加它。您不能保证在这些操作之间不会拾取某些东西,但至少可以保证您不会重复运行 Runnable。 ,如果用 contains 完成,这很容易发生-> remove -> add .

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

关于java - 在 Java 的 ThreadPoolExecutor 中重新排序队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12518143/

相关文章:

c# - 执行更改 UI 的方法时,是否必须在 DIspatcher 上调用 CheckAccess()?

.Net Thread vs ThreadPool vs SerialPort 通信任务

java - 循环访问条目集合时的性能

java - JTextArea 的行号和调整 JTextArea 文本大小的问题

Java - 一个简单的(对除了我之外的每个人)方法 - 继承

java - 在 TextView 中设置结果时出现空指针异常

c# - 使用任务工厂存储每个任务的任务完成时间

python - 哪些 GUI 框架最适合多线程 Python 程序?

java - 使用多线程访问列表

java - 通过 GAE 进行客户端通信