gpt4 book ai didi

java - CompletableFuture 的多个 thenAccept block 的执行顺序是什么

转载 作者:行者123 更新时间:2023-12-02 11:11:06 28 4
gpt4 key购买 nike

所以我有一个返回 CompletableFuture 的方法。在返回之前,此方法添加一个带有 thenAccept 的 block ,该 block 在 CompletableFuture 完成后执行。

此方法的调用者还使用 thenAccept 添加另一个 block 。显然,这可以通过多个链式调用继续进行。

thenAccept 调用返回的 CompletionStage 按什么顺序执行?是否保证是添加的顺序?如果不是,如何保证它们按照添加的顺序执行?

PS:我是根据我自己使用 CompletableFuture 和这个 article 的经验来问这个问题的。

最佳答案

您正在通过链接完成阶段来建模它们的依赖关系。如果将两个操作 AB 链接到另一个操作 C,则可以定义关系 A → CB → C,但 AB 之间没有关系,因此,它们之间没有关系,包括没有顺序关系,换句话说,你甚至不能假设一个会在另一个之后运行,例如

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");
});

很可能会打印类似的内容

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

当然,这并不能保证。

<小时/>

为了加强两个消费者之间的依赖关系,您必须适本地链接它们,例如

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();

这里,第二个消费者链接到 basenext,以接收 base 的结果,但依赖于 next 的完成(如果没有结果通过,您通常不需要完成 - 如果您有这样的场景,也许您想重新考虑您的设计)。

或者,您可以将第一个 Consumer 转换为传递值的 Function,这样您就可以通过 thenApply 将其链接到允许将另一个 thenAccept 阶段链接到它。

关于java - CompletableFuture 的多个 thenAccept block 的执行顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37918062/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com