gpt4 book ai didi

java - 如果从关闭 Hook 调用 System.exit 会发生什么?

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:57 25 4
gpt4 key购买 nike

我在 Java 中有一个相当复杂的关闭 - 有很多清理工作要做。特别是我试图弄清楚如何从关闭 Hook 线程处理错误。我的代码目前包括这个:

try {
return shutdownPromise = doShutdown();
}
catch (Throwable exc) {
logger.error("An exception was thrown while shutting down the application.", exc);
System.exit(1);
return null;
}

当我最初写这篇文章时,我基本上认为,关机错误应该直接进入 exit。但是 exit 并不是那么低级;它调用关闭 Hook 。

所以我想 -

  1. 从关闭 Hook 调用 exit 有什么作用?
  2. 从关闭 Hook 处理错误的正确方法是什么?

最佳答案

首先,答案很简单:您的流程死锁。

System.exit 最终调用 Shutdown.exit,它以 this code block 结尾:

synchronized (Shutdown.class) {
/* Synchronize on the class object, causing any other thread
* that attempts to initiate shutdown to stall indefinitely
*/
sequence();
halt(status);
}

评论是完全准确的。但要理解这一点,我们需要确切了解关闭 Hook 的作用。

关闭 Hook 是通过 ApplicationShutdownHooks.add 添加的,如 this answer here 中所述。 .请注意,上面的 sequence 方法最终结束于 this line of code。在 Shutdown.runHooks 中:

if (hook != null) hook.run();

首先,请注意这些 Hook 不是您的应用程序关闭 Hook 。它们是不同的系统关闭 Hook ,其中之一负责确保您的应用程序关闭 Hook 运行。请注意,这是运行,而不是开始。换句话说,它阻止。这些关闭 Hook 之一将是一个系统 Hook ,它同时启动所有应用程序关闭 Hook (您可以自己或在链接的答案中跟踪此代码),然后阻塞直到它们全部使用 Thread.join 完成称呼。其中之一是您的应用程序关闭 Hook - 如果它调用 System.exit,它将永远等待获取 Shutdown.class 上的锁。

接下来,愚蠢的答案:改为调用 Runtime.getRuntime().halt()。我说“愚蠢的答案”是因为这可能是您想要做的而不是退出的稍微低级的事情。如果 System.exit 表示失败的干净关闭,那么 halt 是总是会立即成功的硬关闭。

接下来,更聪明的答案是:可能什么都没有。出于以下原因,让您的关闭 Hook 完成。您的关机 Hook 不拥有关机 - 特别是,可能还有其他关机 Hook 需要完成它们的工作。相反,我怀疑这个钩子(Hook)的职责之一是最终强制硬关闭。我建议立即将其创建为延迟任务,然后让这个 Hook 正常完成。

关于java - 如果从关闭 Hook 调用 System.exit 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19552358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com