0

我可能在 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>

4

2 回答 2

0

没有。你应该做演员。由于 Java 限制方法覆盖的方式,这是无法避免的。

ListeningExecutorService.invokeAll状态的 Javadoc

返回列表中的所有元素都必须是 ListenableFuture 实例。

于 2012-06-28T08:22:46.710 回答
0

由于不支持使用 Futures.allAsList 而不强制转换Iterable<? extends ListenableFuture<? extends V>>为使用 for 循环的简单解决方案应该是最好的:

    ListeningExecutorService executor = MoreExecutors.sameThreadExecutor();
    List<Future<Object>> futures = executor.invokeAll(
        singletonList(new Callable<Object>() {
            @Override public Object call() throws Exception {
                return 42;
           }
        }
    ));
    List<Object> r = Lists.newArrayList();
    for (Future<Object> future : futures) r.add(future.get());
于 2012-06-28T08:38:26.183 回答