我的目标是从10(或其他任意数量)的异步操作中获取结果列表。
我在并发中使用com.google.guava
实用程序,如果有人可以慷慨地指出我正确的方向,我会非常感激。
在示例中,我正在尝试获取successfulBombs
的列表(Bomb
几乎是一个空对象,但在创建模拟服务调用执行问题时有随机概率抛出问题)
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.");
}
});
关闭我正在寻找的东西:
答案 0 :(得分:6)
列表为空,因为您永远不会向bombs
添加任何内容。您将空列表传递给Futures.successfulAsList
。
答案 1 :(得分:5)
您在寻找ListeningExecutorService.invokeAll(List<Callable<T>>)
吗?也许与Futures.allAsList(List<ListenableFuture<T>>)
结合使用?
答案 2 :(得分: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.");
}
});