Ola*_*nka 7 java java-8 completable-future
所以我有一个方法返回一个CompletableFuture.在返回之前,此方法添加一个块,thenAccept在CompletableFuture完成后执行该块.
此方法的调用者还添加了另一个块thenAccept.显然,这可以继续多个链式调用.
调用CompletionStage返回的顺序是什么thenAccept?是否保证是添加它们的顺序?如果没有,如何保证它们按照添加顺序执行?
PS:我根据自己的经验CompletableFuture和本文提出这个问题
您通过链接它们来建模完成阶段的依赖关系.如果您将两个动作A,并B到另一个动作C,定义关系A ? C和B ? C,但没有关系A,并B因此没有任何关系,包括没有排序关系,他们之间,换句话说,你甚至无法承担的那一方会追逐另一个,即
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAccept(s -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
});
Run Code Online (Sandbox Code Playgroud)
很可能打印出类似的东西
entered first consumer in Thread[ForkJoinPool.commonPool-worker-1,5,main]
entered second consumer in Thread[main,5,main]
leaving second consumer
leaving first consumer
Run Code Online (Sandbox Code Playgroud)
当然,虽然没有保证.
要强制实现两个消费者之间的依赖关系,您必须适当地链接它们,例如
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
CompletableFuture<Void> next = base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAcceptBoth(next, (s,ignored) -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
}).join();
Run Code Online (Sandbox Code Playgroud)
在这里,第二个消费者被链接到base并next接收结果base,但依赖于next完成(如果没有结果通常你通常不会要求 - 也许你想重新考虑你的设计,如果你有这样的话一个场景).
或者,您可以将第Consumer一个转换为Function通过该值的a,因此您可以将其thenApply链接,以允许将另一个thenAccept阶段链接到它.
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |