我在理解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;
}
答案 0 :(得分:2)
get()的主要目的是等待任务完成,然后返回结果。
如果您的任务是Runnable,而不是Callable,它将返回一个Void,因此您已经指出,检查结果没有任何意义。对于此类任务,您只执行等待它们完成即可执行get()。
CompletableFuture的主要优点是允许您处理异常并进一步处理数据的方法。它还具有等待all and single任务从一组ComplatableFuture任务完成的方法。因此,在多线程anv中工作更容易。 get()
方法的工作原理与Future类相同。
更新:
如果您不需要它们在进一步传递到应用程序中之前完成,则根本不需要调用get()方法。但是,最好保留对它们的引用,并在退出程序之前等待它们完成或取消它们。在程序的某个时刻,您可能希望查看它们是否已完成。
但是,如果您希望在进一步操作之前完成该操作,则可以使用CompletableFuture.allOf()
。
在某些情况下,将超时添加到执行中也是明智的,这样您的应用程序中就不会有挂起的线程。这可能很危险,尤其是在移动环境中。
所以这完全取决于您的业务案例。