我假設你關心的是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);
}