2

我的目标是从 10 个(或其他任意数量的)异步操作中获取结果列表。

我正在com.google.guava同时使用公用事业,如果有人能慷慨地指出我正确的方向,我将不胜感激。

在示例中,我试图获取一个列表successfulBombsBomb几乎是一个空对象,但在创建以模拟服务调用执行问题时抛出问题的随机概率)

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
List<ListenableFuture<Bomb>> bombs;
ListenableFuture<List<Bomb>> successfulBombs;

编辑:

这是我到目前为止提出的,但列表是空的,即使它应该有一些成功的元素......我不太明白为什么

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
List<ListenableFuture<Bomb>> bombs = new ArrayList<ListenableFuture<Bomb>>();
for(int i=0;i<10;i++)
{
    ListenableFuture<Bomb> bomb = service.submit(new Callable<Bomb>(){
        public Bomb call() throws Problem
        {
            return craftBomb();
        }
    });
}
ListenableFuture<List<Bomb>> successfulBombs = Futures.successfulAsList(bombs);
Futures.addCallback(successfulBombs, new FutureCallback<List<Bomb>>(){
    public void onSuccess(List<Bomb> bombs)
    {
        System.out.println("My successful bombs");
        for(Bomb b : bombs)
        {
            System.out.println(b);
        }
    }
    public void onFailure(Throwable thrown)
    {
        System.err.println("There was a problem making this bomb.");
    }
});

在结束我正在寻找的内容时:

  • 启动异步操作的正确模式
  • 为结果操作收集列表
  • 使用 guava 框架收集成功操作的列表
4

3 回答 3

6

该列表是空的,因为您从不向bombs. 您将一个空列表传递给Futures.successfulAsList.

于 2012-04-28T02:08:15.800 回答
5

你在找ListeningExecutorService.invokeAll(List<Callable<T>>)吗?也许结合Futures.allAsList(List<ListenableFuture<T>>)?

于 2012-04-28T01:01:09.847 回答
1

工作解决方案如下

    ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
    List<ListenableFuture<Bomb>> bombs = new ArrayList<ListenableFuture<Bomb>>();
    for(int i=0;i<10;i++)
    {
        ListenableFuture<Bomb> bomb = service.submit(new Callable<Bomb>(){
            public Bomb call() throws Problem
            {
                return craftBomb();
            }
        });
        bombs.add(bomb);
    }
    ListenableFuture<List<Bomb>> successfulBombs = Futures.successfulAsList(bombs);
    Futures.addCallback(successfulBombs, new FutureCallback<List<Bomb>>(){
        public void onSuccess(List<Bomb> bombs)
        {
            System.out.println("My successful bombs");
            for(Bomb b : bombs)
            {
                System.out.println(b);
            }
        }
        public void onFailure(Throwable thrown)
        {
            System.err.println("There was a problem making this bomb.");
        }
    });
于 2012-04-28T02:10:06.273 回答