我可能在 Guava API 中遗漏了一些东西。如何在不强制转换的情况下将 ExecutorService.invokeAll 与 Futures.allAsList 一起使用?
我的用例是我想提交一个可调用列表并等到所有都执行(并行)。我只对 Callables 的结果列表感兴趣。
ListeningExecutorService executor = MoreExecutors.sameThreadExecutor(); //or any other ExecutorService
List<Future<Object>> futures =
executor.invokeAll(singletonList(new Callable<Object>() {
@Override public Object call() throws Exception {
return 42;
}
}
));
Iterable<ListenableFuture<Object>> listableFutures =
(Iterable<ListenableFuture<Object>>) (Iterable) futures;
//would like to use "futures" here
ListenableFuture<List<Object>> r = Futures.allAsList(listableFutures);
System.out.println(r.get());
在一个完美的世界里,我想打电话ListeningExecutorService.allAsList(Collection<? extends Callable<T>> tasks)
并得到一个Future<List<T>>
或什至List<T>
。