线程和执行器的正常关闭

2024-01-03

下面的代码试图实现这一点。

该代码永远循环并检查是否有任何待处理的请求。如果有,它会创建一个新线程来处理请求并将其提交给执行器。所有线程完成后,它会休眠 60 秒,并再次检查待处理的请求。

public static void main(String a[]){
    //variables init code omitted
    ExecutorService service = Executors.newFixedThreadPool(15);
    ExecutorCompletionService<Long> comp = new ExecutorCompletionService<Long>(service);
    while(true){
        List<AppRequest> pending = service.findPendingRequests();
        int noPending = pending.size();
        if (noPending > 0) {
            for (AppRequest req : pending) {
                Callable<Long> worker = new RequestThread(something, req);
                comp.submit(worker);
            }
        }
        for (int i = 0; i < noPending; i++) {
            try {
                Future<Long> f = comp.take();
                long name;
                try {
                    name = f.get();
                    LOGGER.debug(name + " got completed");
                } catch (ExecutionException e) {
                    LOGGER.error(e.toString());
                }
            } catch (InterruptedException e) {
                LOGGER.error(e.toString());
            }
        }
        TimeUnit.SECONDS.sleep(60);
    }

  }

我的问题是这些线程完成的大部分处理都涉及数据库。这个程序将在Windows机器上运行。当有人尝试关闭或注销机器时,这些线程会发生什么?如何优雅地关闭正在运行的线程以及执行器?


ExecutorService 的典型有序关闭可能如下所示:

final ExecutorService executor;

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        executor.shutdown();
        if (!executor.awaitTermination(SHUTDOWN_TIME)) { //optional *
            Logger.log("Executor did not terminate in the specified time."); //optional *
            List<Runnable> droppedTasks = executor.shutdownNow(); //optional **
            Logger.log("Executor was abruptly shut down. " + droppedTasks.size() + " tasks will not be executed."); //optional **
        }
    }
});

*您可以记录执行者在等待您愿意等待的时间后仍有任务要处理。
**您可以尝试强制执行程序的工作线程放弃当前任务,并确保它们不会启动任何剩余的任务。

请注意,当用户向您的系统发出中断时,上述解决方案将起作用。java过程或当你的ExecutorService仅包含守护线程。相反,如果ExecutorService包含尚未完成的非守护线程,JVM 不会尝试关闭,因此关闭挂钩不会被调用。

如果尝试关闭进程作为离散应用程序生命周期(而不是服务)的一部分,则关闭代码不应放置在关闭挂钩内,而应放置在程序设计为终止的适当位置。

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

线程和执行器的正常关闭 的相关文章

随机推荐

  • 使用 python 和 OpenCV 从图像中提取数字

    我正在寻找一些编码解决方案 帮助从液晶显示屏中提取数字 然后从图像中输出值 下面是代码和示例图像以及到目前为止我是如何得到的 但我需要一些进一步的帮助来实际从图像中提取 数字 并输出值 我从前面的例子中制作了数字查找表 import the
  • 尝试加载字体时出现 GD 错误

    我尝试通过以下方式加载字体图像加载字体 http www php net manual en function imageloadfont php功能 当我运行脚本时 我收到错误 gd warning product of memory a
  • R语言,暂停循环并要求用户继续

    我有一个想法在某些迭代中暂停循环并向 用户 询问一些答案 例如 some value 0 some criteria 50 for i in 1 100 some value some value i if some value gt so
  • 如何捕获无效的用户输入[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我不理解 Try throw catch 语句 并且想知道当代码中的所有 put 都应该是 int 时 捕获 char 的最佳方式是什么 这
  • TableView 单元格分隔线未延伸到整个单元格

    我正在开发一个新项目 并在 UI 中使用了故事板 我的所有 tableView 都存在行分隔符问题 下图显示了两条线 第一个是在属性检查器中设置的蓝色 第二个是黑色的 添加了我放置在单元格中的 imageView 该线确实延伸到单元格的右侧
  • 如何在 Java 中连接两个列表?

    有没有比以下更简单的方法 List
  • 无需分组即可获得最大值

    假设我有一张这样的表 name age a 1 b 2 c 3 d 4 e 5 f 6 通常 当我们选择 MAX age 时 它返回 f 6 元组 但我想要的是它应该按原样返回表 但所有年龄值都将是最大值 例如 name age a 6 b
  • 使用 Flyway 管理修补程序

    假设我有 2 个分支 Develop与迁移 V1 change1 V2 change2 V3 change3 V4 change4 V5 change5 Master迁移 部署在生产环境中 V1 change1 V2 change2 现在我
  • 如何在 jetpack compose 中显示具有适当大小/布局的垂直文本

    如何在 jetpack 中正确旋转文本并使其进行正确的布局 当我使用rotate文本对象上的修饰符会旋转文本 但布局中占用的大小似乎使用预旋转的文本宽度 这是我想要完成的一个简单示例 垂直文本应该位于狭窄空间的左侧 Composable f
  • 使用 groovy 将 ISO-8859-1 转换为 UTF-8

    我需要将 ISO 8859 1 文件转换为 utf 8 编码 而不丢失内容信息 我有一个如下所示的文件
  • 如何在 Python 中使用 AsciiDoc?

    最初的 AsciiDoc 处理器是用 python 编写的 但 AsciiDoc 演变为用 Ruby 编写的 Asciidoctor 形式 在我搜索如何处理现代 AsciiDoc Asciidoctor 方言 时 我只看到一篇文章 说有一个
  • 模块与命名空间 - 导入与需要 Typescript

    我很困惑module namespace export and import require reference用法 来自 Java 背景 有人可以简单地解释一下我何时使用什么以及什么是正确的设计 当我编写示例项目时 我觉得我搞砸了 到目前
  • XML 序列化类,具有隐藏继承成员的新属性

    我有以下抽象类结构 public abstract class Template Some properties and methods defined public abstract class Template
  • 在 bash 中将命令的输出拆分为关联数组

    输出是 ext4 boot ext2 tank zfs 每行的分隔符是一个空格 我需要一个关联数组 例如 gt ext4 boot gt ext2 tank gt zfs 这在 bash 中是如何完成的 如果命令输出在文件中file the
  • Xcode 6 gitignore 文件应包含哪些内容?

    典型的应该是什么 gitignore包含 Xcode 6 吗 另请参阅有关xccheckoutXcode 5 中引入参见here https stackoverflow com q 18340453 2158465 1 最简单的答案是我的看
  • 重新加载 JavaScript 文件而不刷新 HTML

    我有一个 HTML 它加载了几个 Javascript 文件 当我在浏览器控制台中调试 测试 Javascript 时 是否可以重新加载这些 Javascript 文件 而无需重新加载整个 HTML 页面 您可以删除然后重新添加它们 scr
  • 如何在 MS Access 的 SQL 中实现分页?

    我正在通过 ASP NET 访问 Microsoft Access 2002 数据库 MDB OdbcConnection类 尽管速度很慢 但效果很好 我的问题是关于如何在 SQL 中实现分页以查询该数据库 因为我知道我可以实现TOP子句为
  • 如何通过 Jenkins 脚本控制台设置“扫描组织触发器”?

    我需要一种通过 Jenkins 脚本控制台设置 扫描组织触发器 的方法 这很接近 但仅显示多分支或组织扫描触发器 如果它们已存在 https github com cloudbees jenkins scripts blob master
  • 在 Jetty 中从 http 重定向到 https

    我想从 http myurl 永久重定向到 https myurl 但在 Jetty 中我只找到 MovedContextHandler 用它我只能重定向上下文路径 例如从 myurl bla 到 myurl bla bla
  • 线程和执行器的正常关闭

    下面的代码试图实现这一点 该代码永远循环并检查是否有任何待处理的请求 如果有 它会创建一个新线程来处理请求并将其提交给执行器 所有线程完成后 它会休眠 60 秒 并再次检查待处理的请求 public static void main Str