- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个返回 CompletableFuture
的方法。在返回之前,此方法添加一个带有 thenAccept
的 block ,该 block 在 CompletableFuture
完成后执行。
此方法的调用者还使用 thenAccept
添加另一个 block 。显然,这可以通过多个链式调用继续进行。
thenAccept
调用返回的 CompletionStage
按什么顺序执行?是否保证是添加的顺序?如果不是,如何保证它们按照添加的顺序执行?
PS:我是根据我自己使用 CompletableFuture
和这个 article 的经验来问这个问题的。
最佳答案
您正在通过链接完成阶段来建模它们的依赖关系。如果将两个操作 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");
});
很可能会打印类似的内容
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();
这里,第二个消费者链接到 base
和 next
,以接收 base
的结果,但依赖于 next
的完成(如果没有结果通过,您通常不需要完成 - 如果您有这样的场景,也许您想重新考虑您的设计)。
或者,您可以将第一个 Consumer
转换为传递值的 Function
,这样您就可以通过 thenApply
将其链接到允许将另一个 thenAccept
阶段链接到它。
关于java - CompletableFuture 的多个 thenAccept block 的执行顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37918062/
我想调用CompletableFuture.supplyAsync()将阻塞任务委托(delegate)给另一个线程。一旦该任务完成,我希望 CompletableFuture.thenAccept
我想调用 CompletableFuture.supplyAsync() 将阻塞任务委托(delegate)给另一个线程。一旦该任务完成,我希望 CompletableFuture.thenAccep
我正在尝试从使用 CompletableFuture 的方法执行异步调用.完成该任务后,我尝试打印对象 DummyObject 的值,这些值对于调用异步调用的方法是本地的。 我想知道它是如何工作的?线
与某些博客中所述(例如 I can't emphasize this enough: thenAccept()/thenRun() methods do not block )不同,Completab
我正在做一个有很多 CompletableFuture.completedFuture ... thenAccept 代码的项目,例如 public CompletableFuture cal
我正在开发一个与其他网络应用程序通信的网络应用程序。有时,我的系统会向其他系统发送 HTTP 请求作为通知。由于他们的响应对我来说不是必需的,我使用 Java 8 CompletableFuture
我正在尝试从我的 CompletableFuture 中返回一个列表,如下所示: public List get() { CompletableFuture> providersRespons
我正在阅读关于 CompletableFuture 的文档,thenAccept() 的描述是 Returns a new CompletionStage that, when this stage
所以我有一个返回 CompletableFuture 的方法。在返回之前,此方法添加一个带有 thenAccept 的 block ,该 block 在 CompletableFuture 完成后执行
我在 CompletableFuture 的 supplyAsync() 中处理长时间运行的操作,并将结果放入 thenAccept()。有时 thenAccept() 在主线程上执行,但有时它在工作
如何在单元测试中避免手动休眠。假设在下面的代码中,Process 和 notify 处理大约需要 5 秒。所以为了完成处理,我增加了 5 秒的 sleep 时间。 public class Class
如何在单元测试中避免手动休眠。假设在下面的代码中,Process 和 notify 处理大约需要 5 秒。所以为了完成处理,我增加了 5 秒的 sleep 时间。 public class Class
我是一名优秀的程序员,十分优秀!