- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于 Guava 的 ListeningExecutorService 是通过包装现有的 ExecutorService 来实现的,因此它通过拦截 execute() 方法来“装饰”任务。这意味着如果我想在底层 ExecutorService 上使用自定义 PriorityQueue,我的比较器将装饰任务“视为”作为 ListenableFutureTask 对象而不是原始对象。
有没有办法掌握它包装的任务?以便队列的比较器可以使用任务权重来确定排序?
最佳答案
我假设您关心 submit()
而不是 execute()
? (见我回复的底部。)
带 ListeningExecutorService
来自 MoreExecutors.listeningDecorator
(你所指的那种包装器),你运气不好。 listeningDecorator
,最喜欢 ExecutorService
实现,将任何输入包装到 submit
在 FutureTask
.此问题的正常解决方案是实现 AbstractExecutorService
并覆盖 newTaskFor
返回一个自定义对象。这也应该在这里工作。您基本上会重新实现 listeningDecorator
,这是一个相当简单的包装 AbstractListeningExecutorService
,它本身就是 AbstractExecutorService
的一个相当简单的包装器.
有两个复杂的问题。 (好吧,可能还有更多。我承认我还没有测试过我建议的方法。)
AbstractListeningExecutorService
不允许您覆盖 newTaskFor
. (为什么?我可以解释你是否愿意 file a feature request 。)因此,你必须扩展 AbstractExecutorService
直接,很大程度上复制(短)AbstractListeningExecutorService
执行。 newTaskFor
必须返回 ListenableFuture
那也是Comparable
. ListenableFuture
的明显选择是 ListenableFutureTask
,但那个类(class)是 final
,因此您无法创建实例 Comparable
.解决办法是创建一个ListenableFutureTask
并将其包裹在 SimpleForwardingListenableFuture
中实现 Comparable
. submit()
而不是
execute()
?
listeningDecorator(...).execute()
不包装输入任务,如我刚刚写的这个测试所示:
public void testListeningDecorator_noWrapExecuteTask() {
ExecutorService delegate = mock(ExecutorService.class);
ListeningExecutorService service = listeningDecorator(delegate);
Runnable task = new Runnable() {
@Override
public void run() {}
};
service.execute(task);
verify(delegate).execute(task);
}
关于guava - 如何将 PriorityBlockingQueue 与 ListeningExecutorService 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988842/
我使用 PriorityBlockingQueue 来维护对象列表,这些对象的顺序由比较器决定。我的要求如下:首先,我将N对象添加到队列中,队列用它来维护有序列表。后来,我更改了已添加到队列中的对象中
在PriorityBlockingQueue的规范中,它说: While this queue is logically unbounded, attempted additions may fail
我有一个PriorityBlockingQueue如下: BlockingQueue robbleListQueue = new PriorityBlockingQueue(); Robble实现Co
我有一个包含元素列表的 PriorityBlockingQueue。我已经实现了 Comparable 接口(interface)并覆盖了 compareTo() 以定义哪个元素小于、等于或大于其他元
我正在使用 PriorityBlockingQueue 来存储功能的 tf-idf 分数。由于这部分是多线程的,我使用 synchronized block 来处理并发性: long ticAdd =
我正在尝试编写一个返回 CompletableFuture 的单线程执行器当任务被调度并基于 PriorityBlockingQueue 执行任务时. 我的任务如下所示: public inter
如果某个任务已经在阻塞队列中(假设轮询已满)并且我现在希望它具有更高的优先级,如何更改它的优先级? 例如:实现这个答案 Specify task order execution in Java 我将线
我有一个应用程序,它从多个序列化对象日志中读取对象并将它们交给另一个类进行处理。我的问题集中在如何高效、干净地读取对象并将其发送出去。 代码是从应用程序的旧版本中提取的,但我们最终保持原样。直到上周才
根据Javadocs , PriorityBlockingQueue 不保证具有相同优先级的元素的排序。他们建议使用辅助键 (sequenceNumber) 来强制执行特定的排序(例如 FIFO)。
我一直在阅读 source code of PriorityBlockingQueue在 Java 中,我想知道: 为什么 tryGrow() 方法释放在 offer() 方法中获取的锁,只是为了非阻
我有一个 PriorityBlockingQueue。单个线程一次从该队列中消费一条消息并对其进行处理。其他几个线程正在将消息插入队列。生产者线程为他们提交的每条消息分配一个完整的优先级。静态 Ato
PriorityBlockingQueue 有多少把锁?take 和put 操作是否同步?我找不到有关此类队列的太多信息。我使用的是单线程 PriorityQueue。 最佳答案 How many l
DelayQueue public class DelayQueue extends AbstractQueue implements BlockingQueue 1、 Delayed元
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭10 年前。 Improve th
我正在尝试为我的游戏制作一个简单的消息管理器。但是,我收到以下异常: Exception in thread "main" Exception in thread "Thread-4" java.la
public class CompareOrder implements Comparator { @Override public int compare(T left, T rig
我在自定义线程拉取中使用 PriorityBlockingQueue 时遇到问题,其中 poll 方法导致 NullPointerException。使用此设置时 int POOL_SIZE = 5;
首先:我已经阅读了以下两个问题及其可能的解决方案: ScheduledThreadPoolExecutors and custom queue Java Executors: how can I se
我在这个例子中使用 PriorityBlockingQueue 实现了我的 ThreadPoolExecutor: https://stackoverflow.com/a/12722648/22067
我进行了很多搜索,但找不到解决问题的方法。 我有自己的类 BaseTask,它使用 ThreadPoolExecutor 来处理任务。我想要任务优先级,但是当我尝试使用 PriorityBlockin
我是一名优秀的程序员,十分优秀!