Google Guava Concurrency中Futures.addCallBack()
和Futures.transform()
之间的区别是什么。
根据文档:
Futures.addCallBack()
addCallback(ListenableFuture<V> future, FutureCallback<? super V> callback)
注册在Future计算完成时运行的单独成功和失败回调,或者如果计算已经完成,则立即注册。
Futures.transform()
transform(ListenableFuture<I> input, AsyncFunction<? super I,? extends O> function)
返回一个新的ListenableFuture,其结果是从给定Future的结果异步派生的。
根据我的理解,addCallback()
将在异步处理完成时注册成功或失败回调。在这种情况下,我们可以根据成功或失败条件处理输出(例如:日志记录,流量控制等。)。并且transform()
仅返回异步对象。那么差异只是Callback?。
AsyncFunction
中使用Function
和transform(ListenableFuture<I> input, Function/AsyncFunction <? super I,? extends O> function)
有什么区别? (AsyncFunction仅用于嵌套Futures.transform()
?) 我尝试了什么:
我尝试编写如下代码,这是否是一个好习惯。
public ListenableFuture<MyObject> doSomething() {
logger.info( "Entered in dosomething() Method." );
ListeningExecutorService executor =
MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(50));
ListenableFuture<MyObject> myAsyncObject =
calculator.calculateSomething(input);
//internally calculator.calculateSomething() have multiple asynchronous
// calls and I am using Futures.transform(), without callback.
Futures.addCallback(myAsyncObject, new FutureCallback<MyObject>() {
public void onSuccess(MyObject result) {
logger.info( "Calculation Completed successfully." );
//TODO: check for success and log it.
}
public void onFailure(Throwable thrown) {
logErrorDetails(thrown);
}
}, executor);
executor.shutdown();
return myAsyncObject;
}
答案 0 :(得分:1)
你没有在你的问题中写出完整的方法签名
addCallback
不返回任何内容transform
返回保存函数结果的未来(如果输入成功)或原始输入失败(如果没有)。这允许使用类似于语法的构建器进行链转换。我没有使用过AsyncFunction
,但据我所知他们添加了一个异步性级别,即Future
的结果是另一个Future
。