java - 有没有办法延迟可完成未来的执行?
问题描述
我将使用 CompletableFuture 进行异步调用。我想知道是否有办法延迟其执行。对于一个流程,我有大约 5 个异步调用,然后我根据需要链接然后使用 thenApply/thenCompose。我的问题是当我为调用创建第一个 CF 时,只要线程空闲,它就会开始执行。我希望首先我的所有任务都应该被链接起来,然后当我调用完成()时,它开始执行。我正在寻找的是类似于 Java 流中的中间操作的东西。在我之前关于 SO 的一个问题中,我对此有一些帮助,但这并没有解决我的目的。
我的技术栈只支持 Java 8,所以不能使用下一个版本中推出的任何功能。
解决方案
我还不能写评论,所以我不能要求澄清。请原谅我,如果我没有正确理解,你需要什么。据我所知,您基本上只是在寻找一种方法来延迟 CompletableFuture 的执行,直到您准备好这样做。
您是否考虑过为要调用的函数提供另一个 CF 作为参数?准备好后,只需完成此 CF 即可执行该函数。它有点像这样:
CompletableFuture<Void> setup = new CompletableFuture<>();
delayedFunction(setup);
//do whatever you want
System.out.println("foo");
//once you are ready, complete setup to execute the delayed function
setup.complete(null);
public static CompletableFuture<Void> delayedFunction(CompletableFuture<Void> setup) {
return setup.
thenAccept(v-> {
System.out.println("bar");
});
}
推荐阅读
- c - 在没有开发板的情况下在 Windows 上的 Eclipse 中运行 ARM 代码?
- intellij-idea - 如何在 IntellijIDEA 而不是 XCode 中打开 .bazel 文件扩展名?
- javascript - 如何使用 Yarn 将 TypeScript 转换为 JavaScript?
- mongodb - Mongo聚合为每个文档添加两个相同长度的数组的对应元素
- socket.io - 如何将 socket.io 与 graphql 订阅一起使用?
- c# - 在对话框关闭或执行下一个操作之前,我必须单击多次...如何解决此问题?
- python - 如何从 @cached_property 装饰器中清除缓存?
- laravel - 如何获得创建的作业 ID
- c# - 在 async/await 最佳实践中处理同步方法(一路乌龟)
- javascript - Angular,本地 API,难以在我的应用程序上实现发布请求和返回/显示结果