java - Java CompletableFuture 获取方法
问题描述
我在理解 CompletableFuture 时遇到了一些麻烦。我不明白 get() 方法。如果我错了,请纠正我,但它说“如果有必要等待这个未来完成,然后返回它的结果。” 因此,如果我不返回任何结果,我就不必调用 get 方法了吗?请看下文。即使我不调用 get() 方法,它仍然可以完成它的工作。所以我理解 get() 好像未来会返回一些它会有意义的东西,否则 get() 对于不返回任何东西的未来是不必要的。
//Since it does not return something two statements below do the same thing.
CompletableFuture.runAsync(doSomething());
CompletableFuture.runAsync(doSomething()).get();
private final CompletableFuture<Void> doSomething() {
//do something
return null;
}
解决方案
get() 的主要目的是等待任务完成,然后返回结果。
如果您的任务是Runnable,而不是Callable,它将返回一个 Void,因此正如您所指出的,检查结果是没有意义的。对于此类任务,您执行 get() 只是为了等待它们完成。
CompletableFuture 的主要优点是允许您处理异常并进一步处理数据的方法。它还具有等待所有和单个任务从一组 ComplatableFuture 任务中完成的方法。所以在多线程 anv 中工作更容易。方法与Future类get()
的工作方式相同。
更新:
如果在进一步传递应用程序之前不需要它们完成,则根本不必调用 get() 方法。但明智的做法是保留对它们的引用,并在退出程序之前等待它们完成或取消它们。在程序的某个时间点,您可能想查看它们是否已完成。
但是如果你想在继续之前完成,那么你可以使用CompletableFuture.allOf()
.
在某些情况下,为它们的执行添加超时也是明智之举,这样您的应用程序中就不会出现挂起的线程。这可能很危险,尤其是在移动环境中。
因此,这一切都取决于您的业务案例。
推荐阅读
- reactjs - 地理编码反应传单
- java - Hibernate ORA-01792: 表或视图中的最大列数为 1000 - HBM 转换为注释
- c++ - 哪种实现对代码可读性更好?
- rust - 关于 Rust 的函数参数和所有权的一点问题
- git - 有没有办法使用 push.default = current 并将其设置为自动跟踪该远程分支?
- javascript - 是否可以不重建整个应用程序而仅在 Nextjs 中生成新的静态文件?
- pandas - 英国车牌 - 在字符串的不同部分互换 0/O
- java - Reactor Kafka 中没有创建订阅错误
- ajax - 使用 ajax 重新加载部分页面
- r - 如何在 R 中为 Sobol 灵敏度分析创建采样矩阵(包“灵敏度”)