假设我有以下代码:
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 只是为了说明这一点,我想知道的是在计算时间很长的情况下。
最佳答案
区别在于负责运行代码的 Executor
。 CompletableFuture
上的每个算子通常有 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/