当前位置: 首页 > 面试题库 >

Java CompletableFuture的thenApply和thenApplyAsync有什么区别?

凌成天
2023-03-14
问题内容

假设我有以下代码:

CompletableFuture<Integer> future  
        = CompletableFuture.supplyAsync( () -> 0);

thenApply 案件:

future.thenApply( x -> x + 1 )
      .thenApply( x -> x + 1 )
      .thenAccept( x -> System.out.println(x));

这里输出将2.现在的情况thenApplyAsync

future.thenApplyAsync( x -> x + 1 )   // first step
      .thenApplyAsync( x -> x + 1 )   // second step
      .thenAccept( x -> System.out.println(x)); // third step

我在这个博客中读到,每个步骤thenApplyAsync都是在单独的线程中执行的,并且“同时”执行(这意味着thenApplyAsyncs在先于thenApplyAsyncs结束之前先开始执行),如果是这样,那么如果第一步没有完成,那么第二步的输入参数值是多少?

如果第二步不采取措施,第一步的结果将流向何方?第三步将采取哪一步的结果?

如果第二步必须等待第一步的结果,那么意义何在Async

这里x-> x + 1只是为了说明这一点,我想知道的是在很长的计算情况下。


问题答案:

区别Executor在于负责运行代码的。每个运算符CompletableFuture通常具有3个版本。

  1. thenApply(fn)- fnCompleteableFuture调用它的线程定义的线程上运行,因此您通常不知道在哪里执行该线程。如果结果已经可用,它可能会立即执行。
  2. thenApplyAsync(fn)- fn无论环境如何,都在环境定义的执行程序上运行。为此CompletableFuture通常ForkJoinPool.commonPool()
  3. thenApplyAsync(fn,exec)-运行fnexec

最后,结果是相同的,但是调度行为取决于方法的选择。



 类似资料:
  • 这里的输出将是2。现在,对于: 我在这篇博客中读到,每个在一个单独的线程中执行,并且“同时”(这意味着在前面的完成之前启动)。如果是,如果第一步没有完成,第二步的输入参数值是什么? 如果没有第二步迈出,第一步的成果将何去何从?第三步会采取哪一步的结果?

  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 问题内容: JavaScript中的&和&&有什么区别? 示例代码: 似乎&&是一个逻辑上的“和”,如果两个都为true,则总是为我提供第二个值。 但是什么是&? (顺便说一下,&&在Python中似乎是“ and”;&在Python中似乎是&。) 问题答案: 是按位AND 该运算符期望 两个数字 并重新调整一个 数字。 如果它们不是数字,则将其强制转换为数字。 注意: 在Javascript中,