在 Java 中将 ExecutorService 转为守护进程

2023-11-27

我正在 Java 1.6 中使用 ExecutoreService,只需通过以下方式启动

ExecutorService pool = Executors.newFixedThreadPool(THREADS). 

当我的主线程完成(以及线程池处理的所有任务)时,该池将阻止我的程序关闭,直到我显式调用

pool.shutdown();

我可以通过某种方式将该池使用的内部线程管理转换为守护线程来避免调用它吗?或者我在这里遗漏了一些东西。


可能最简单且首选的解决方案是马可13的回答所以不要被投票差异(这个答案早了几年)或接受标记所愚弄(这只是意味着这个解决方案适合OP情况,而不是一般来说它是最好的)。


您可以使用ThreadFactory将 Executor 内的线程设置为守护进程。这将以某种方式影响执行程序服务,它也将成为守护线程,因此如果没有其他非守护线程,它(以及它处理的线程)将停止。这是一个简单的例子:

ExecutorService exec = Executors.newFixedThreadPool(4,
        new ThreadFactory() {
            public Thread newThread(Runnable r) {
                Thread t = Executors.defaultThreadFactory().newThread(r);
                t.setDaemon(true);
                return t;
            }
        });

exec.execute(YourTaskNowWillBeDaemon);

但是如果你想得到执行器,让它完成任务,同时自动调用它的shutdown()方法当应用程序完成时,您可能需要用以下内容包装您的执行器Guava's MoreExecutors.getExitingExecutorService.

ExecutorService exec = MoreExecutors.getExitingExecutorService(
        (ThreadPoolExecutor) Executors.newFixedThreadPool(4), 
        100_000, TimeUnit.DAYS//period after which executor will be automatically closed
                             //I assume that 100_000 days is enough to simulate infinity
);
//exec.execute(YourTask);
exec.execute(() -> {
    for (int i = 0; i < 3; i++) {
        System.out.println("daemon");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中将 ExecutorService 转为守护进程 的相关文章

随机推荐

  • 如何在mysql中按年龄段对用户数量进行分组

    本质上我有一个 mysql 数据库 其中包含用户及其相应的出生日期 我还发现了以下代码 可以帮助我找到用户从出生日期算起的实际年龄 查找出生日期我需要做的是找到不同的 年龄段 并计算该年龄段的用户数量 我也发现了this示例准确地展示了如何
  • 有没有办法让不和谐机器人通过accept_invite或类似的东西加入服务器?

    注意 我使用的是discord py 0 16 12 我想知道是否有任何方法可以让机器人在代码中加入服务器 就像有一个命令是这样的 client command pass context True async def join ctx in
  • 如何在pygame中显示文本? [复制]

    这个问题在这里已经有答案了 我无法弄清楚如何在 pygame 中显示文本 我知道我不能像常规 Python IDLE 那样使 用 print 但我不知道如何使用 import pygame sys from pygame locals im
  • 带有 QAbstractListModel 的 QListView 显示空列表

    我创建了一个非常简单的例子QListView与定制QAbstractListModel The QListView显示但它是空的 我究竟做错了什么 Code include
  • Android:以编程方式从 Java 代码填充微调器

    如何以编程方式从 java 代码填充微调器 我的布局中有一个微调器 如下所示
  • GWT DataGrid 自动高度

    我正在尝试在我的应用程序中插入 gwt 数据网格 如果我设置静态高度 500px 一切都会很好 但我想让 dataGrid 自动调整到屏幕尺寸 当高度为 100 时 我得到一个空白屏幕 我还尝试将数据网格放入 resizeLayoutPan
  • 在沙箱中运行 .Net 应用程序

    几个月来 我开发了一个个人工具 用于在线编译 C 3 5 Xaml 项目 基本上 我使用 CodeDom 编译器进行编译 我正在考虑将其公开 但问题是使用此工具在服务器上执行任何操作都非常非常容易 我想保护我的服务器的原因是因为有一个 运行
  • 将php字符串分割成不同长度的块

    我正在寻找将字符串拆分为数组的方法 类似于str split 其中块的大小都不同 我可以通过用一堆循环遍历字符串来做到这一点substr 但这看起来既不优雅也不高效 是否有一个接受字符串和数组的函数 例如 1 18 32 41 108 12
  • 是否可以识别哈希类型?

    我知道您可以比较长度 但许多哈希类型具有相同的长度 有没有办法识别哈希的类型以及它是否已加盐 例如 hash 2bf231b0e98be99a969bd6724f42a691 hash 4ac5a4ff764807d6ef464e27e4d
  • 如何从 Laravel URL 中删除 /public/ [重复]

    这个问题在这里已经有答案了 我想删除 public 来自我的 Laravel 5 URL 的片段 我不想运行虚拟机 这在项目之间切换时看起来很尴尬 我不想将文档根目录设置为公共文件夹 这在项目之间切换时也很尴尬 我尝试过 htaccess
  • p:steps 但启用点击所有步骤

    我有使用标签的 primefaces 步骤
  • 如何解决 Java 泛型中由交集类型引起的不明确方法?

    我最近发现您可以在单个类型参数绑定中指定多个类型 请参阅示例 与任何新工具一样 我一直在尝试探索如何使用 和滥用 它的可能性 我精心设计了这个例子来帮助说明 在下面的示例中 编译器给我一个错误 调度 新 AlphabetSoup 方法dis
  • CSS 背景不透明度[重复]

    这个问题在这里已经有答案了 我正在使用类似于以下代码的东西 div style background image url div Text div div 我预计这将使背景的不透明度为 0 4 文本的不透明度为 100 相反 它们的不透明度
  • 使div边框的一部分透明html

    我可以使 div 边框的一部分 从 x1 到 x2 透明吗 如果没有 您可以建议什么方法 我的想法 非常糟糕 是在 canvas 元素中绘制边框并将其放置在 div 元素上 画布主体是透明的 由于 DIV 只有 4 个元素 上 下 左 右
  • 如何四舍五入到最接近的 10(或 100 或 X)?

    我正在编写一个函数来绘制数据 我想为 y 轴指定一个很好的整数max大于数据集的最大值 具体来说 我想要一个函数foo执行以下操作 foo 4 5 foo 6 1 10 maybe 7 would be better foo 30 1 40
  • Google OAuth 2.0 include_granted_scopes 不适用于已安装的应用程序

    我正在尝试使用新的增量授权对于已安装的应用程序 以便将范围添加到现有授权 同时保留现有范围 这是使用新的完成的include granted scopes true范围 但是 无论我尝试什么 重新授权总是会完全覆盖范围 这是我编写的用于演示
  • 删除我的 Rails 答案中不必要的 HTTP 标头

    我目前正在开发一个 API 其中大小很重要 我希望答案包含尽可能少的字节 我优化了 JSON 答案 但 Rails 仍然响应许多奇怪的标头 HTTP 1 1 200 OK Server nginx 0 7 67 Not from Rails
  • 创建一个运行程序的新任务

    我需要定义一个自定义任务来计算主类的名称然后运行它 我在想这样的事情 customTask mainClass compute main class name based on env runMain mainClass jvm args
  • 使用 ggplot2 绘制二部网络图

    我有以下数据框 structure list X1 structure c 1L 1L 1L 1L 1L 1L 1L 1L 2L 2L 2L 2L 2L 2L 2L 2L 2L 2L 3L 3L 3L 3L 4L 4L 4L 4L 4L 5
  • 在 Java 中将 ExecutorService 转为守护进程

    我正在 Java 1 6 中使用 ExecutoreService 只需通过以下方式启动 ExecutorService pool Executors newFixedThreadPool THREADS 当我的主线程完成 以及线程池处理的