如果我不调用 .join() 方法,CompletableFuture 线程将永远关闭?


CompletableFuture retrunsVal = CompletableFuture.supplyAsync(() -> {
//some logic
return new Object();
});
CompletableFuture notRetrunsVal = CompletableFuture.runAsync(() -> {
//some logic
});

根据我目前的理解,如果我不调用retrunsVal.join();,那么只要服务器启动,第一次调用中打开的线程就永远不会关闭,但即使我不在第二次调用中调用notRetrunsVal.join();,打开的线程也会在执行时立即关闭。

如果我有正确的理解,请告诉我。

谢谢。。。

如果你担心开放线程的关闭,我相信你可以使用

runAsync(Runnable Runnable,Executor Executor(和CompletableFuture的supplyAsync(供应商-供应商,执行器-执行器(API。这两个API都需要执行器,您希望在该执行器上执行任务。

来自CompletableFuture.supplyAsync(Supplier):的文档

返回一个新的CompletableFuture,该任务由ForkJoinPool.commonPool((中运行的任务异步完成,其值通过调用给定的Supplier获得。

它在后台使用线程池。这意味着两个期货可以在不同的线程中运行。

如果您等待第一个future完成,然后在它完成后运行第二个future,它可能会使用同一个线程,因为它是重复使用的,但也可以使用不同的线程。

由于线程池属于JVM实例,当JVM关闭时,它将关闭,因此当JVM停止时,线程池也将停止。

来自ForkJoinPool.commonPool((的文档:

返回公共池实例。此池是静态构建的;其运行状态不受shutdown((或shutdownNow((尝试的影响。然而,此池和任何正在进行的处理都会在程序System.exit(int(时自动终止。任何依赖异步任务处理在程序终止前完成的程序都应该在退出前调用commonPool((.awaitQuience。

只要JVM保持活动状态,用于CompletableFuture.supplyAsync(Supplier)的线程池就会保持活动状态。

.join唯一在等待未来完成的事情,并没有结束任何事情。

最新更新