假设我有以下代码:

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

我在这个 blog 中读到每个 thenApplyAsync 都在一个单独的线程中执行,并且“同时”(这意味着在 0x2518122231343141 之前开始之前的 0x251812231341 的第一个值是什么,如果第一个参数是第二步,那么如果第一个参数是没做完?

如果不采取第二步,第一步的结果将何去何从?
第三步会走哪一步的结果?

如果第二步必须等待第一步的结果,那么 thenApplyAsyncs 有什么意义?

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

最佳答案

区别在于负责运行代码的 ExecutorCompletableFuture 上的每个算子通常有 3 个版本。

  • thenApply(fn) - 在调用它的 fn 定义的线程上运行 CompleteableFuture,所以你通常不知道这将在哪里执行。如果结果已经可用,它可能会立即执行。
  • thenApplyAsync(fn) - 无论情况如何,都在环境定义的执行程序上运行 fn。对于 CompletableFuture 这通常是 ForkJoinPool.commonPool()
  • thenApplyAsync(fn,exec) - 在 fn 上运行 exec

  • 最终结果是一样的,但调度行为取决于方法的选择。

    关于java - Java CompletableFuture 的 thenApply 和 thenApplyAsync 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47489338/

    10-16 20:12