【发布时间】:2014-05-19 10:41:42
【问题描述】:
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() 只返回异步对象。所以区别只是回调?
- 我的理解是否正确?
- 哪一个最适合用于异步处理?
- 如果我需要按顺序调用多个异步方法,有什么最佳做法吗?
- 在
transform(ListenableFuture<I> input, Function/AsyncFunction <? super I,? extends O> function)中使用AsyncFunction和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;
}
【问题讨论】:
-
区别在于你如何使用它。转换可以一起通过管道传输,而正常的回调正在终止。
-
请注意,在您关闭现在的执行程序上运行回调(将来)会遇到问题(依次添加回调)。您通常也不希望为方法的每次调用创建不同的执行程序。
标签: java asynchronous concurrency guava