问题标签 [shutdown-hook]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 为什么官方 JVM 文档与 addShutdownHook 中的实现相矛盾?
对于属于 class 的关闭钩子是Thread
在调用关闭的线程上运行它们的可运行代码还是在它们自己上运行,存在一些冲突。
addShutdownHook
将 aThread
作为参数。这意味着线程将启动并run
自行运行其方法。这也与以下文档一致addShutdownHook
:
公共无效 addShutdownHook(线程挂钩)
注册一个新的虚拟机关闭挂钩。Java 虚拟机关闭以响应两种事件:
- 程序正常退出,当最后一个非守护线程退出或调用 exit(等效于 System.exit)方法时,或
- 虚拟机响应用户中断(例如键入 ^C)或系统范围的事件(例如用户注销或系统关闭)而终止。
关闭挂钩只是一个已初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩并让它们同时运行。当所有钩子都完成后,如果 finalization-on-exit 已启用,它将运行所有未调用的终结器。最后,虚拟机将停止。请注意,在关闭序列期间,守护线程将继续运行,如果通过调用 exit 方法启动关闭,非守护线程也将继续运行。
(强调我的)
但是,代码如下:
(!!
评论我的)
请注意,这与 JDK 6 相比变化不大,这使得问题更加清晰:
起初我以为我读错了,然后调用run
神奇地启动了线程。但事实并非如此。我自己编写了run
代码。该代码不会启动线程(在 a 的情况下,假设在线程上运行Thread
是自然且正确的。)run
所以这里确实有问题。是 Javadoc 和addShutdownHook
方法的签名,每个代码不应该采用线程,而是可运行?是执行吗?还是更有可能是罪魁祸首——我;如果是这样,如何?
java - 如果从关闭挂钩调用 System.exit 会发生什么?
我在 Java 中有一个相当复杂的关闭 - 有很多清理工作要做。特别是我试图弄清楚如何从关闭钩子线程中处理错误。我的代码目前包括:
当我最初写这篇文章时,我基本上认为,关机中的错误应该直接转到exit
. 但exit
不是那么低的水平;它调用关闭挂钩。
所以我认为 -
- 从关闭挂钩调用退出有什么作用?
- 从关闭挂钩错误处理的正确方法是什么?
spring - 我们如何在项目中使用 addShutdownHook?
我看到一些代码像这样使用 ShutdownHook
这样做有什么用吗?
我想
当jvm退出时,可能线程会立即关闭,spring上下文也会关闭;</p>
当我们需要调用 System.exit() 时,我们下一步该怎么做?
java - 阻止 EclipseLink 在关闭挂钩执行之前关闭连接
看起来 EclipseLink 在关闭挂钩执行之前正在关闭连接。(我不是 100% 确定,但从我的实验来看是这样的。)我需要在关闭钩子中做一些事情,所以我需要阻止 EclipseLink 关闭连接。作为一个澄清的例子,在 Log4j 中,我可以在 XML 配置文件中使用这个指令来做到这一点:
EclipseLink 有类似的东西吗?
java - 关机钩子如何区分正常和突然(由用户)关机
在我的应用程序中,我添加了一个关闭挂钩,用于清理和完成最后一个事务。正如所有文档所说,这个钩子也被称为“正常”关机 - 如果一切都完成了。
但我想给用户一些反馈:
“检测到 ctrl-c - 正在尝试完成……”
我只想在“突然”关闭时给出这个反馈。
那么有没有办法检测关闭挂钩中的关闭类型?
java - 发送 QUIT 信号时不调用 addshutdownHook
我想在执行“kill -s 3”时终止 Java 应用程序。但是 Java 转储了线程信息。我需要使用不同的终止信号吗?
java - 以编程方式从关闭挂钩访问退出状态
想知道如何以编程方式System.exit
从关闭挂钩中访问退出状态?不同类型的关闭需要在我的应用程序中导致不同的逻辑(关闭有多“难”),我正在考虑这样做的几种方法,但这将是最简单的。
java - java关闭挂钩“系统找不到消息文本”
我的 Server 类的主要方法中有以下关闭挂钩:
当我停止服务器(通过按 Ctrl+c)时,关闭挂钩会完成它应该做的所有事情(它工作得很好),但是我收到以下消息并且服务器不会完成关闭(我必须按 Ctrl+ c):
系统在应用程序的消息文件中找不到消息号 0x237b 的消息文本。
在我更新到 Java 7 之前,我不认为它曾经这样做过!任何想法为什么它可能会这样做?
java - 关闭钩子与终结器方法
我只是不明白为什么必须使用 Runtime.addShutdownHook。如果您想在 jvm 退出时进行一些清理,为什么不重载守护程序类的 finalize 方法。与 finalize 方法相比,使用关闭挂钩有什么优势。
还有一个已弃用的函数 runFinalizersOnExit。如果我将其设置为 false,我相信终结器将不会运行。这与 java 保证终结器总是在垃圾收集之前运行相矛盾。
java - 关于关机钩子的查询
- 如果我正确理解了每个 java 进程都与一个单独的 JVM 实例相关联,并且每个 JVM 实例都由操作系统提供一个堆内存,操作系统也会在 JVM 终止时重新收集该堆内存。
So on termination even if there were some memory leaks all the memory will be reclaimed by the OS(Please correct if I have mistaken)
. - 如果第 1 点是真的,为什么我们必须使用关闭挂钩。谷歌搜索后,主要建议释放所有资源并正常关闭。
Even if it does not gracefully shutdown all the memory and resources would be freed?
- 我写了一个简单的关机钩子。在我的主线程中,我正在运行一个无限循环,然后使用中的终止按钮终止进程
Eclipse
。但是关闭钩子线程没有运行。Eclipse 中的终止进程是否会Runtime.getRuntime().halt(status)
因为 AFAIK 突然终止 JVM 而未执行关闭挂钩而调用? 最后,如果我的主要代码如下 -
为什么
After exit
不打印?当关闭钩子正在执行时,主线程必须继续进一步执行并打印After exit
?