completablefuture线程是否会关闭?

dldeef67  于 2021-07-16  发布在  Java
关注(0)|答案(2)|浏览(1407)
CompletableFuture retrunsVal = CompletableFuture.supplyAsync(() -> {
    //some logic
    return new Object();
});

CompletableFuture notRetrunsVal = CompletableFuture.runAsync(() -> {
    //some logic
});

以我目前的理解,如果我不打电话 retrunsVal.join(); 那么,只要服务器启动,在第一次调用中打开的线程就永远不会关闭,但即使我不调用 notRetrunsVal.join(); 在第二次调用中,打开的线程在执行时将立即关闭。
请让我知道如果我有正确的理解。
谢谢您。。。

ztmd8pv5

ztmd8pv51#

如果您担心关闭开放线程,我相信您可以使用
completablefuture的runasync(runnable runnable,executor executor)和SupplySync(supplier supplier,executor executor)API。这两个api都需要一个executor来执行任务。

aiqt4smr

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 正在等待未来的完成,这不关什么事。

相关问题