首页 > 解决方案 > 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;
}

标签: javaasynchronousjava-8completable-future

解决方案


get() 的主要目的是等待任务完成,然后返回结果。

如果您的任务是Runnable,而不是Callable,它将返回一个 Void,因此正如您所指出的,检查结果是没有意义的。对于此类任务,您执行 get() 只是为了等待它们完成

CompletableFuture 的主要优点是允许您处理异常并进一步处理数据的方法。它还具有等待所有和单个任务从一组 ComplatableFuture 任务中完成的方法。所以在多线程 anv 中工作更容易。方法与Futureget()的工作方式相同。

更新:

如果在进一步传递应用程序之前不需要它们完成,则根本不必调用 get() 方法。但明智的做法是保留对它们的引用,并在退出程序之前等待它们完成或取消它们。在程序的某个时间点,您可能想查看它们是否已完成。

但是如果你想在继续之前完成,那么你可以使用CompletableFuture.allOf().

在某些情况下,为它们的执行添加超时也是明智之举,这样您的应用程序中就不会出现挂起的线程。这可能很危险,尤其是在移动环境中。

因此,这一切都取决于您的业务案例。


推荐阅读