Google Guava并发中Futures.addCallBack()和Futures.transform()之间的区别

时间:2014-05-19 10:41:42

标签: java asynchronous concurrency guava

Google Guava ConcurrencyFutures.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?。

  1. 我的理解是否正确?
  2. 哪个是最适合异步处理的?
  3. 如果我需要在序列中调用多个异步方法,那么还有最佳实践吗?
  4. AsyncFunction中使用Functiontransform(ListenableFuture<I> input, Function/AsyncFunction <? super I,? extends O> function)有什么区别? (AsyncFunction仅用于嵌套Futures.transform()?)
  5. 我尝试了什么:
    我尝试编写如下代码,这是否是一个好习惯。

    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;
    }
    

1 个答案:

答案 0 :(得分:1)

你没有在你的问题中写出完整的方法签名

  • addCallback不返回任何内容
  • transform返回保存函数结果的未来(如果输入成功)或原始输入失败(如果没有)。这允许使用类似于语法的构建器进行链转换。

我没有使用过AsyncFunction,但据我所知他们添加了一个异步性级别,即Future的结果是另一个Future