【问题标题】:CompletableFuture thread will ever be closed if I don't call .join() method?如果我不调用 .join() 方法,CompletableFuture 线程将永远关闭?
【发布时间】:2021-03-22 05:40:35
【问题描述】:
CompletableFuture retrunsVal = CompletableFuture.supplyAsync(() -> {
    //some logic
    return new Object();
});

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

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

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

谢谢...

【问题讨论】:

    标签: java spring multithreading spring-boot java-threads


    【解决方案1】:

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

    runAsync(Runnable runnable, Executor 执行器) 和 supplyAsync(Supplier supplier, Executor executor) CompletableFuture 的 API。这两个 API 都需要您要在其上执行任务的 executor。

    【讨论】:

      【解决方案2】:

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

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

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

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

      由于线程池属于一个JVM实例,所以当JVM关闭时,线程池也会关闭,所以当JVM停止时,线程池也会停止。

      来自ForkJoinPool.commonPool()的文档:

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

      只要 JVM 还活着,用于CompletableFuture.supplyAsync(Supplier) 的线程池就会一直活着。

      .join 唯一的事情是等待未来完成,这不会关闭任何东西。

      【讨论】:

      • 如果我的问题让您感到困惑,我深表歉意,但我的意思是,如果他们单独调用它们会如何表现,可能一个在“A”JVM 上,另一个在“B”上JVM,如果我在这两种情况下都不调用 .join() ,打开的线程是否会被关闭?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      相关资源
      最近更新 更多