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

Cha*_*har 5 java concurrency asynchronous guava

是什么区别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?

  1. 我的理解是否正确?
  2. 哪个是异步处理最好的?
  3. 如果我需要在序列中调用多个异步方法,那么有什么最佳实践吗?
  4. 使用AsyncFunctionFunctionin有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;
}
Run Code Online (Sandbox Code Playgroud)

rds*_*rds 1

好吧,您没有在问题中写出完整的方法签名

  • addCallback什么也不返回
  • transform返回保存函数结果(如果输入成功)或原始输入失败(如果不成功)的 future。这允许使用流畅的语法进行链式转换。

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