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