CompletableFuture retrunsVal = CompletableFuture.supplyAsync(() -> {
//some logic
return new Object();
});
CompletableFuture notRetrunsVal = CompletableFuture.runAsync(() -> {
//some logic
});
以我目前的理解,如果我不打电话 retrunsVal.join();
那么,只要服务器启动,在第一次调用中打开的线程就永远不会关闭,但即使我不调用 notRetrunsVal.join();
在第二次调用中,打开的线程在执行时将立即关闭。
请让我知道如果我有正确的理解。
谢谢您。。。
2条答案
按热度按时间ztmd8pv51#
如果您担心关闭开放线程,我相信您可以使用
completablefuture的runasync(runnable runnable,executor executor)和SupplySync(supplier supplier,executor executor)API。这两个api都需要一个executor来执行任务。
aiqt4smr2#
从
CompletableFuture.supplyAsync(Supplier)
:返回一个新的completablefuture,该Future由运行在forkjoinpool.commonpool()中的任务异步完成,其值通过调用给定的供应商获得。
它在后台使用线程池。这意味着两个未来可以在不同的线程中运行。
如果您等待第一个将来完成,然后在它完成后运行第二个将来,它可能会使用相同的线程,因为它是重用的,但也可以使用不同的线程。
由于线程池属于一个jvm示例,当jvm关闭时,它将被关闭,因此当jvm停止时,线程池也将停止。
来自forkjoinpool.commonpool()的文档:
返回公共池示例。这个水池是静态建造的;其运行状态不受shutdown()或shutdownnow()尝试的影响。但是,这个池和任何正在进行的处理在程序system.exit(int)时自动终止。任何依赖于异步任务处理在程序终止前完成的程序都应该调用commonpool()。在退出前等待静止。
用于的线程池
CompletableFuture.supplyAsync(Supplier)
只要jvm保持活动状态,jvm就会保持活动状态。唯一
.join
正在等待未来的完成,这不关什么事。