当前位置: 首页 > 知识库问答 >
问题:

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

双元魁
2023-03-14

Google Guava并发中的< code > futures . add callback()和< code>Futures.transform()有什么区别?

根据文件:

Futures.addCallBack():
addCallback(ListenableFuture)

futures . transform():< br > < code > transform(ListenableFuture

根据我的理解,异步处理完成后,addCallback()会注册成功或失败的回调。在这种情况下,我们可以根据成功或失败的情况(例如:日志记录、流控制...等)来处理输出。和进()只返回异步对象。所以区别只是回调?。

  1. 我的理解是否正确
  2. 哪一个是异步处理的最佳选择
  3. 如果我需要在一个序列中调用多个异步方法,有什么最佳实践吗
  4. 在<code>转换(ListenableFuture)中使用<code>异步函数</code>和<code>函数</code>有什么区别

我尝试的内容:
我尝试编写下面这样的代码,无论这是否是一个好的实践。

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个答案

夹谷志
2023-03-14

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

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

我没有使用过< code>AsyncFunction,但我知道它们增加了一个异步级别,即< code >未来的结果是另一个< code >未来。

 类似资料:
  • 我在尝试Python-Selenium的XPath。 我使用这个链接来尝试教程中的一些XPath: 所以我尝试了XPaths的这两个变体。 返回9个结果 “//”如何匹配5个更多的结果?

  • 问题内容: 我有两个问题,可能需要一些帮助来理解它们。 和之间有什么区别?我知道这 意味着在单独的外壳中运行命令,然后将其传递给变量。有人可以帮助我理解这一点吗?如果我错了,请纠正我。 如果我们可以使用并且效果很好,那我为什么不能使用它呢?两者的执行周期有何不同? 问题答案: 语法是令牌级别的,因此美元符号的含义取决于其所在的令牌。表达式是现代代名词,代表命令替换;这意味着运行并将其输出放在此处。

  • 问题内容: 我对和感到困惑。我有两本PHP书。一个说它们是相同的,但是另一个说它们是不同的。我以为他们也一样。 他们不一样吗? 问题答案: 是按位与。请参见按位运算符。假设您这样做: 是逻辑AND。请参阅逻辑运算符。考虑一下这个真值表:

  • 问题内容: 这个问题已经在这里有了答案 : JavaScript比较中应使用哪个等于运算符(== vs ===)? (49个答案) 5个月前关闭。 和之间的区别是什么?我也看过和运算符。还有更多这样的运营商吗? 问题答案: 并且是严格的比较运算符: JavaScript具有严格和类型转换相等性比较。为了相等,要比较的对象必须具有相同的类型,并且: 当两个字符串在相同位置具有相同的字符序列,相同的长

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。