我假设你关心的是submit()
而不是? (请参阅我的回应底部。)
与ListeningExecutorService
MoreExecutors.listeningDecorator
(你指的包装类型),你运气不好。与大多数ExecutorService
实现一样,listeningDecorator
将中的任何输入包装为submit
。解决此问题的常规方法是执行AbstractExecutorService
并覆盖newTaskFor
以返回自定义对象。这也应该在这里工作。你基本上是重新实现listeningDecorator
,这是一个相当简单的包装AbstractListeningExecutorService
,这本身是一个相当简单的包装AbstractExecutorService
。
有两个并发症。 (OK,可能有更多的,我承认,我没有测试过我建议的做法。)
AbstractListeningExecutorService
不允许您覆盖newTaskFor
。 (为什么?我可以解释你是否想要file a feature request。)因此,你必须直接AbstractExecutorService
直接,主要是复制(短)AbstractListeningExecutorService
实施。
newTaskFor
必须返回ListenableFuture
这也是Comparable
。 ListenableFuture
的明显选择是ListenableFutureTask
,但该类别为final
,因此您无法创建实例Comparable
。解决方案是创建一个ListenableFutureTask
和将其包装在实现Comparable
的SimpleForwardingListenableFuture
中。
为什么我假设你正在处理submit()
而非?
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);
}