【问题标题】:Difference between Futures.addCallBack() and Futures.transform() in Google Guava ConcurrencyGoogle Guava Concurrency 中 Futures.addCallBack() 和 Futures.transform() 的区别
【发布时间】: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() 只返回异步对象。所以区别只是回调?

  1. 我的理解是否正确?
  2. 哪一个最适合用于异步处理?
  3. 如果我需要按顺序调用多个异步方法,有什么最佳做法吗?
  4. transform(ListenableFuture<I> input, Function/AsyncFunction <? super I,? extends O> function) 中使用AsyncFunctionFunction 有什么区别? (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


【解决方案1】:

您没有在问题中写下完整的方法签名

  • addCallback 不返回任何内容
  • transform 返回一个保存函数结果(如果输入成功)或原始输入失败(如果不是)的未来。这允许使用流畅的语法链接转换。

我没有使用过AsyncFunction,但我知道它们添加了一层异步性,即Future 的结果是另一个Future

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多