问题标签 [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 - GUI 应用程序在 Shutdown Hook 消息出现之前关闭
Java新手在这里。这是交易:我有以下简单的关机钩子:
我有一个带有 TextArea 的 GUI 应用程序,输出被重定向,因此消息显示在那里。它的窗口监听器再次非常简单:
当我使用 [X] 按钮关闭 GUI 应用程序时,消息会在整个关闭之前显示一瞬间。这里没有错。
我想做的是:消息打印后,等待几秒钟,足以清楚地看到消息已打印。由于应用程序仍会立即关闭,因此向run方法添加睡眠或等待或其他任何内容似乎都不起作用。
我猜shutdown-hook实际上正在正常工作,只是应用程序不在乎并立即关闭GUI,而我的钩子在Java边缘的某个地方打印了它的消息。
那是对的吗?如果是,是否有任何简单的方法来确保 GUI 应用程序仅在关闭挂钩完成后关闭,而不使关闭挂钩成为非关闭挂钩?
java - 在关闭挂钩期间关闭 I/O 流
我正在用 Java 编写服务器-客户端应用程序,我希望服务器在客户端崩溃或意外关闭时向客户端发送消息。
whereout
是用于写入客户端的输出流,ServerQuit
表示服务器崩溃时发送的消息。
这样做安全吗?Javadocs 说人们不应该“盲目地依赖可能已经注册了自己的关闭钩子的服务,因此它们自己可能正在关闭过程中。” 由于 JVM 关闭时 I/O 流会自动关闭,所以我的关闭挂钩会起作用吗?也就是说,在关闭挂钩运行时,I/O 流是否已经关闭?
java - Java 关闭挂钩并写入 Excel 工作表
如此高级,我有一个程序可以从 Excel 电子表格中读取数据,并将其存储在哈希映射列表中,执行圆顶操作,获取状态,然后将信息写回 Excel 电子表格。截至目前,如果某种异常导致程序崩溃或程序正常完成,一切都很好。
现在我正在尝试处理如果用户通过按 Ctrl + C 来终止运行的情况。我认为最好的方法是实现我自己的关闭挂钩。
在我的 Main() 中,我将其注册为关闭挂钩
当程序进入关闭挂钩时,一切都很好,直到它到达写入文件的部分,然后它开始抛出一堆异常,最后我得到一个损坏的电子表格。
这是我的编写代码:
我假设正在发生的是,处理我的 excel 电子表格的对象在写入完成之前被清除,或者我在写入之前存储数据的哈希映射列表被清除。
我已将 Thread Joins 视为解决我的问题的一种可能方法,但在查看它们时,我认为它们不是我问题的解决方案。
所以我想我的问题是我如何让它以我希望的方式工作
干杯,迈纳特
编辑:这是例外
编辑2:好吧,我想出了自己的问题。我以错误的方式接近这个。我的代码是正确的,唯一的问题是在我的 finally 块中我还有一个文件写入。因此,当我的程序在没有中断的情况下一直执行时,它会执行两次写入,这是导致异常的原因。我通过检查是否执行了 finally 块以及是否跳过了关闭挂钩中的写入来解决此问题。
最后:
关机挂钩
macos - 在 Mac OS X 上仅在关机时(不注销或重新启动)运行脚本
有没有办法只在关机时运行脚本?
我的意思是,只有当计算机真正关闭到关闭状态时。仅在注销或重新启动时不应运行此脚本。
java - 如何让 IntelliJ 调试器允许我的应用程序的关闭挂钩运行?
在 IntelliJ 中调试注册关闭挂钩的应用程序时,如果我单击绿色的“重新启动”圆形箭头按钮,也不会单击红色方形的“停止”按钮,则不会调用关闭挂钩。在这两种情况下,调试下的应用程序似乎都会立即被强制终止。
(请注意,这不是我如何停止在 intelliJ 中运行的处理以便它调用关闭挂钩的副本?)
当我“手动”从 Mac 终端向调试器进程发送一个 INT 信号时,当然我的关闭挂钩会按预期运行。但我无法在 IDE 中发现任何会引发所需行为的配置设置或控件。
java - 将 SIGTERM 发送到 JVM 是否安全
尽管 JVM 会将SIGTERM 和类似信号转换为关闭挂钩,但许多服务关闭脚本使用 TCP 端口来启动关闭。(例如Tomcat的关闭端口、Java Service Wrapper、JBoss的管理接口等)
所以我认为不鼓励使用信号和关闭挂钩来优雅地关闭 java 服务,直到我发现Play! 框架使用关闭钩子管理服务生命周期,并且生成的启动脚本play dist
假定信号将被发送到 JVM 的 PID。
我知道信号是依赖于平台的,使用 TCP 端口是一种以跨平台方式管理服务的简单且可扩展的方式,但我想知道它的安全性以及当我依赖时需要考虑哪些风险将 SIGTERM 和关闭挂钩作为服务关闭的主要方法。
guava - EventBus google guava 关闭钩子
目前我在我的应用程序中使用 guava EventBus 方法。侦听器尝试做一些工作,如果失败,事件应该返回总线并重新发送。
我的问题是:如果我的应用程序出现故障(执行关闭)怎么办?它会在总线上发送剩余的事件吗?
我正在寻找一些方法,例如在ActiveMQ 中实现关闭如何
代理是否应该安装一个关闭钩子,以便它可以在 JVM 终止时正确关闭自己
不幸的是,我在 EventBus guava 中没有找到类似的东西。
java - Java并发:运行直到终止
我目前正在重构一段代码,几乎是这样的:
这个想法是我想使用 aScheduledExecutorService
来运行代码:
不过,我对此有一些担忧:首先,程序main()
在调度后“终止”(如返回),但 JVM 保持活动状态,因为它ScheduledExecutorService
仍在运行。我相信这是故意的,为了保持旧代码的“一直运行直到从外部终止”的行为,但我相信我必须安装一个关闭挂钩以确保ScheduledExecutorService
正确关闭。真的会是这样,还是“从外部杀死”也会阻止执行关闭挂钩?
其次,我也对首先有一个关闭钩子感到不安。如果我有类似的代码
是否还会存在与上述相同的“从外部杀死”的担忧?
编辑:是的,原始程序循环通过而没有打破循环;它只是从 SIGINT (终端中的 control-C)终止。这是一个定义不明确的终止条件,但这是我现在唯一拥有的东西......
java - java 线程在操作系统启动关闭期间停止(与 JAVA 文档相矛盾!)
java.lang.Thread.setDaemon(布尔值)
当唯一运行的线程都是守护线程时,Java 虚拟机退出。
然而在下面的代码中,“安全关闭”在中断(操作系统风格)进程时永远不会发生,不,我没有使用 SIGKILL ......
由于文档错误(?)是我唯一的办法来跟踪所有非守护线程并在关闭挂钩中加入它们吗?
java - 树莓派 Java 关机钩子
我有一个运行 Java 1.8.0 的 Raspberry Pi 和一个名为 test.jar 的文件。当我运行代码然后使用 Ctrl+Z 停止程序时,Shutdown 钩子不会运行,但是当我在 Windows 上运行代码并停止它时,shutdown 钩子将起作用。
我该如何解决这个问题,谢谢