Java 在FutureCallback中启动ListenableFuture,并在所有操作完成后回调

Java 在FutureCallback中启动ListenableFuture,并在所有操作完成后回调,java,guava,Java,Guava,我试图为ListenableFutures创建一个嵌套的回调层,如下所示: ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); ListenableFuture<A> futureA = service.submit(() -> a.doSomething()); Futures.addCallback(futureA,

我试图为ListenableFutures创建一个嵌套的回调层,如下所示:

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));

ListenableFuture<A> futureA = service.submit(() -> a.doSomething());

Futures.addCallback(futureA, new FutureCallback<A>() {
    @Override
    public void onSuccess(A result) {
         ListenableFuture<B> futureB = service.submit(() -> b.doSomething(result)
    }
});
listengExecutorService=MoreExecutors.listengDecorator(Executors.newFixedThreadPool(10));
ListenableFuture=service.submit(()->a.doSomething());
Futures.addCallback(futureA,newfutureallback(){
@凌驾
成功时公开作废(结果){
listenablefutureb=服务提交(()->b.doSomething(结果)
}
});
futureA
futureB
都完成时,如何添加回调


这是一个简单的例子,但我正在寻找一个解决方案,该解决方案可能具有多个
ListenableFuture
层,可能可以选择使用
allAsList
创建一个新的未来。(我想您不介意同时启动
a
b

//不知道A和B是如何关联的,所以我假设

ListenableFuture
allAsList
?我编辑了我的问题,以便futureB取决于futureB的结果。futureB在futureB完成之前不存在,这种情况下有什么建议吗?在您在
futureB
的回调中提交回调后,您可以在
futureB
上添加回调。您的答案是正确的,但我发现很薄gs在处理复杂的工作流时遇到了麻烦。Java 8
CompletableFuture
builder风格的界面对于多层任务执行的问题非常有效。在Scala中,我几乎从不创建回调。
map
s,
flatMap
s效果更好。Scala中函数编程的第12章()解释为什么类似于
flatMap
的(一元)表达式不能用
traverse
表示。我建议对此类用例评估
flatMap
(用于理解)。
//No idea how A and B are related, so I assume Object
ListenableFuture<List<? extends Object>> futureAB = Futures.allAsList(futureA, futureB);
Futures.addCallback(futureAB, ...);
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));

ListenableFuture<A> futureA = service.submit(() -> a.doSomething());

Futures.addCallback(futureA, new FutureCallback<A>() {
    @Override
    public void onSuccess(final A result) {
         ListenableFuture<B> futureB = service.submit(() -> b.doSomething(result);
         Futures.addCallback(futureB, new FutureCallback<B>() {
              ©Override
              public void onSuccess(final B resultB) {
                  //Do something with result and resultB.
              }
         });
    }
});