问题描述
区别Executor
在于负责运行代码的。每个运算符CompletableFuture
通常具有3个版本。
-
thenApply(fn)
-fn
在CompleteableFuture
调用它的线程定义的线程上运行,因此您通常不知道在哪里执行该线程。如果结果已经可用,它可能会立即执行。 -
thenApplyAsync(fn)
-fn
无论环境如何,都在环境定义的执行程序上运行。为此CompletableFuture
通常ForkJoinPool.commonPool()
。 -
thenApplyAsync(fn,exec)
-运行fn
上exec
。
最后,结果是相同的,但是调度行为取决于方法的选择。
解决方法
假设我有以下代码:
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只是为了说明这一点,我想知道的是在很长的计算情况下。