如何在java 8中使用CompletableFuture启动异步任务并让主线程完成并退出

2023-11-26

我有以下代码(或多或少):

ExecutorService executor = Executors.newFixedThreadPool(10);
CompletableFuture
    .supplyAsync(()->{
        return longRunningMethodThatReturnsBoolean();
    }, executor)
    .thenAcceptAsync(taskResult -> {
        logResult();
        executor.shutdown(); 
    }, executor);

这允许主线程中的代码继续执行,但是我希望主线程在完成后会终止,而 future 继续在它自己的线程中工作,但主线程保持活动状态,直到 CompletableFuture 完成,即使主线程不在不再做任何事了

我对此有点陌生,我错过了什么吗?有可能吗?

任何帮助将不胜感激!!!


实际上,如果你的主线程不等待CompletableFuture's .get()或任何其他阻塞方法,那么它一旦到达末尾就会死亡main方法。

您可以使用以下示例进行检查:

public static void main(String[] args){
    final Thread mainThread = Thread.currentThread();
    ExecutorService executor = Executors.newFixedThreadPool(10);
    CompletableFuture
            .supplyAsync(()-> {
                try {
                    Thread.sleep(1000);
                    //prints false
                    System.out.println("Main thread is alive: " + mainThread.isAlive());
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return true;
            }, executor)
            .thenAcceptAsync(taskResult -> {
                System.out.println("LongRunning is finished");
                executor.shutdown();
            }, executor);
}

But the Java虚拟机继续执行线程,直到发生以下任一情况

  • Runtime 类的 exit 方法已被调用,并且安全管理器已允许进行退出操作。
  • 所有线程不是守护进程线程已死亡,要么是通过从 run 方法的调用返回,要么是抛出异常 传播到 run 方法之外。

这意味着即使主线程死了,虚拟机仍然继续工作,因为由主线程创建的所有线程Executors.newFixedThreadPool(10) are 非守护进程。您可以在文档 of the defaultThreadFactory()方法中的Executors class:

每个新线程都被创建为非守护线程,其优先级设置为 Thread.NORM_PRIORITY 和允许的最大优先级中较小的一个 在线程组中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在java 8中使用CompletableFuture启动异步任务并让主线程完成并退出 的相关文章

  • JPA 实体中的方法是否允许抛出异常?

    我尝试创建的 Entity 有问题 当尝试使用 OpenJPA 实现在 Eclipse 中测试类时出现问题 我有not尝试过其他人 所以不确定它是否适用于他们 我的测试用例非常简单 因为它创建一个 EntityManagerFactory
  • Windows 上的虚假唤醒。是否可以?

    我最近学习了 虚假唤醒 有人说这个问题只可能发生在某些类型的 Linux PC 上 我用的是窗户 我为虚假唤醒编写了测试 我得到的结果是这是可能的 但我想向您展示这个测试 也许我在某个地方犯了错误 我的初始变体 import java ut
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • 修复 java 内存泄漏的学习网站

    学习修复 java 内存泄漏的最佳地点是什么 我一直试图在网络上找到好的资源 但令我失望的是 我发现正在讨论玩具示例 我还能够对小型玩具转储进行故障排除 但现实世界的应用程序转储更具挑战性 并且提供的线索很少 我尝试过 Jhat JMap
  • lombok - 多个镜头中的 @Builder 模式

    I use Builder of 龙目岛项目 https github com rzwitserloot lombok 所以考虑我有这个例子 Builder public class Client private Getter Setter
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • Java 创建 Thread 实例时会发生什么

    我有一个关于 Java 线程和操作系统线程的问题 我读了Java 线程与 Pthreads https stackoverflow com questions 5269535 java threads vs pthreads and Jav
  • Java HttpURLConnection:内容长度计算

    我目前正在为 bitbucket issues RESTful API 开发一个库 我取得了很大的进步 现在我要解决这个部分更新问题 http confluence atlassian com display BBDEV Issues Is
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 在 Java 和 PHP 之间加密/解密字符串

    我使用 AES 加密来加密和解密服务器端的 php 和 Android 应用程序 作为客户端 之间的字符串 PHP 中的加密字符串为 HaxRKnMxT24kCJWUXaVvqDHahzurJQK sYA4lIHql U 在 Java 中是
  • 使用 javax.mail 和 CentOS 的邮件服务器

    我有一个 Java 程序 安装在一台旧的 Ubuntu 机器上 并使用 javax mail 发送邮件 然而 那台机器宕机了 我现在在新的 CentOS 机器上运行相同的 Java 应用程序 但是 当我尝试使用 mail smtp host
  • 在java中设置Process对象的安全性

    有人可以告诉我如何限制通过进程对象访问系统属性吗 如果我通过进程对象运行以下代码 我可以抛出安全异常吗 System getProperty user home 请告诉我如何为流程对象配置证券 在ProcessBuilder类文档中 环境方
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • 无法运行简单的 doclet 程序:包 com.sun.javadoc 不存在

    我正在尝试运行一个简单的 doclet 程序 但无法编译它 javac cp cygdrive c Progra 2 Java jdk1 8 0 65 lib tools jar A java 但它抛出 A java 1 错误 包 com
  • java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.type。使用 apache beam Spark runner 运行 go 示例时

    我想跑grades https github com apache beam tree master sdks go examples gradesapache beam go sdk 提出的示例 在一个主服务器和两个从服务器 spark2
  • 如何实现再次播放功能?

    我希望在游戏结束时得到提示 如果我还想再玩一次的话 并使用 Y N 输入 退出游戏或重复游戏 我该如何以最有效的方式解决这个问题 编辑 描述资源路径位置类型 类型 Main Main java ScaredyCat src se grupp
  • Spring Boot 健康执行器 - 什么时候上线?

    我找不到任何有关 Springs Health Actuator 何时返回 UP 状态的文档 你能依靠一切吗 Components正在初始化 会不会 Controller准备好满足请求了吗 为了测试应用程序上下文是否已加载 您可以执行此自定
  • java.lang.NoClassDefFoundError:com.google.ads.AdView

    我正在尝试将 admob 广告合并到我的应用程序中 到目前为止我已经添加了以下代码 在我的应用程序主要活动的 onCreate 方法中 adView new AdView this AdSize BANNER my code number
  • 如何在 SpringDoc OpenAPI 3 中引用文件?

    我有 Spring Boot 项目 我想在其中记录我的 API 这里是正在处理的 Web 服务的示例 ApiResponses value ApiResponse responseCode 200 content Content media
  • gwt - 在 RPC 调用中使用 List

    我有一个 RPC 服务 方法如下 public List

随机推荐

  • R:有效地从数组中删除单维

    我正在寻找一种快速方法来从 R 数组中删除冗余维度 类似于squeeze MATLAB 中的命令 现在我结合了melt 和cast 命令来自reshape2包 但应该有一种不太复杂的方法来做同样的事情 到目前为止我就是这样做的 requir
  • 将 stargazer 与通过在分割 data.frame 上 lapply-ing 创建的 lm 对象列表一起使用

    我正在尝试为一组回归创建一个观星表 其中我对数据的子集运行每个回归 我认为 做到这一点的自然方法是使用split要从我的数据创建 data frames 列表 请使用以下命令创建 lm 对象列表lapply在 data frames 列表上
  • 从流中读取 XML

    我正在使用 ASP NET 并从表单导入 XML 文件 现在我将其转换为Stream Stream inputStream XmlFileUploadControl PostedFile InputStream 因为我以后可能需要这个版本
  • OSX 上 JVM 的 Zombie http.proxyHost 设置

    我最近更改了网络 并从 OSX Leopard 上的系统偏好设置 网络面板中删除了所有 HTTP 代理设置 然而 现在每当我使用 Eclipse 时 Java HTTP 代理系统属性似乎都会 自动 设置为使用我现在已失效的 HTTP 代理
  • 如何在CSS中使图像悬停?

    我想在悬停时将图像从正常更改为更亮 我的代码 div class nkhome a href Home html img src Images btnhome png a div nkhome margin left 260px top 1
  • 关于Spring框架应用中Beans.xml配置文件的使用

    我正在学习Spring MVC 今天 试图了解如何实现 JDBC DAO 我在 Spring Spring 而不是 Spring MVC 中找到了这个 Hello World 并且我开始看到它 因为我认为要实现 DAO 我必须创建一个单独的
  • 如何管理docker中的临时文件?

    我正在运行一个 Java 应用程序 它以给定格式读取一些数据并在临时目录中写入 CSV 文件 该文件完全写入后 数据将批量加载到数据库中 加载完成后 该文件将立即删除 不应共享此文件 现在 我想在 docker 容器中运行该应用程序的 ja
  • 有没有办法在 Android 设备上安全地存储用户数据?

    我正在编写一个应用程序 用户有时会通过它下订单 我想让用户可以选择保存他们的账单信息 姓名 地址等 以便以后如果他们想再次下订单时可以快速恢复 用户将输入密码以保护数据 显然 我不能只是将其作为文件放在设备上 因为任何人都可以 root 查
  • 在 BigQuery 中包含带有 ANY_VALUE 的空值

    我有一个 供应商 表 看起来像这样 company itemKey itemPriceA itemPriceB companyA 203913 20 10 companyA 203914 20 20 companyA 203915 25 5
  • 首先将列添加到带有数据库的 aspnetusers

    我找到了许多通过数据库迁移向身份表添加列 我已成功移至应用程序数据库 的教程 但我的理解是这不适用于数据库拳头项目 那么 如何将列添加到数据库第一个项目中的 aspnetusers 表中 我想添加一个名为 Is RegComplete 的位
  • PHP 函数使用外部变量

    function parts part structure http site url content echo tructure part php 这个函数使用了一个变量 site url这是在本页顶部定义的 但该变量未传递到函数中 我们
  • 如何使用 iframe 进行异步(AJAX)文件上传?

    我正在尝试使用ajax上传文件 我读到如果不使用就不可能做到这一点iframe 我写
  • 分解 C++ 代码大小

    我正在为旧博客文章中的第一个问题寻找一个很好的 Stack Overflow 风格答案C 代码大小 我将在下面重复 我真的很想要一些工具 最好是基于 g 来显示编译 链接代码的哪些部分是从 C 源代码的哪些部分生成的 例如 查看是否正在为数
  • 如何生成随机数,每个随机数与所有其他元素的差异至少为 x?

    我知道这违背了随机数的定义 但我的项目仍然需要这个 例如 我想生成一个包含 5 个随机元素的数组range 0 200 现在 我希望每个元素之间至少有 15 的差异 所以随机数组应该看起来像这样 15 45 99 132 199 我可以使用
  • 使用 Javascript 将 HTML 的 DocType 作为字符串获取

    我知道我可以通过访问 doctype 对象document doctype or document childNodes 0 但我的问题是将 doctype 作为字符串获取 我可以通过调用在 chrome 和 safari 中执行此操作do
  • 如何使用 Spring Boot 配置嵌入式 ActiveMQ Broker URL

    我遵循了一个使用 Spring Boot 版本 1 4 X 设置和运行嵌入式 ActiveMQ 的简单示例 这是示例的链接https spring io guides gs messaging jms 我的课程结构如下 SpringBoot
  • 为什么在 Python 中修改父框架仅适用于模块框架?

    我正在玩inspect stack 我尝试修改父框架的局部变量 它似乎仅在父框架是模块级时才有效 以下代码显示了这一点 Python 2 7 import inspect def outer a 10 print a modify prin
  • C# 自动关闭消息框

    我目前正在用 C 开发一个应用程序 在其中显示 MessageBox 如何在几秒钟后自动关闭消息框 您将需要创建自己的窗口 其隐藏代码包含加载的处理程序和计时器处理程序 如下所示 private void Window Loaded obj
  • 在 iOS 中将图像保存到 SQLite 以及从 SQLite 检索图像

    我正在尝试将图像保存到 Sqlite 然后将图像加载到 UIImageView 但它没有得到工作 我不知道出了什么问题 这是我正在使用的代码 谁能帮我解决这个问题 void saveImage sqlite3 stmt compiledSt
  • 如何在java 8中使用CompletableFuture启动异步任务并让主线程完成并退出

    我有以下代码 或多或少 ExecutorService executor Executors newFixedThreadPool 10 CompletableFuture supplyAsync gt return longRunning