submit()ではなく、execute()?に関心があると思います。(私の回答の一番下をご覧ください。)
ListeningExecutorServicefrom (参照するラッパーの種類) を使用MoreExecutors.listeningDecoratorすると、運が悪くなります。listeningDecoratorは、ほとんどの実装と同様に、入力をにExecutorServiceラップします。この問題の通常の解決策は、カスタム オブジェクトを返すように実装およびオーバーライドすることです。ここでもうまくいくはずです。基本的に を再実装します。これは のかなり自明なラッパーであり、それ自体は のかなり自明なラッパーです。submitFutureTaskAbstractExecutorServicenewTaskForlisteningDecoratorAbstractListeningExecutorServiceAbstractExecutorService
2 つのカップルの合併症があります。(OK、もっとあるかもしれません。私が提案しているアプローチをテストしていないことを認めます。)
AbstractListeningExecutorServiceをオーバーライドすることはできませんnewTaskFor。(理由は?機能リクエストを提出したい場合は説明できます。) その結果、直接拡張AbstractExecutorServiceAbstractListeningExecutorServiceする必要があり、(短い)実装が大幅に複製されます。
newTaskForも返すListenableFuture必要がありComparableます。a の明らかな選択はListenableFutureですがListenableFutureTask、そのクラスはfinalであるため、インスタンスを作成することはできませんComparable。解決策は、 を作成して、を実装するListenableFutureTaskにラップすることSimpleForwardingListenableFutureComparableです。
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);
}