如何确保在退出java应用程序之前运行一段代码

如何确保在退出java应用程序之前运行一段代码,java,shutdown-hook,Java,Shutdown Hook,我使用的是一个许可API,它有一种方法可以从具有有限数量许可证的许可证服务器获取/释放许可证对象。在我的应用程序开始时,我调用该方法来获取许可证,但我希望确保即使我的程序突然终止/崩溃(异常、SIGTERM等),也能释放该许可证。关闭钩子是解决此问题的最佳方法吗?如果程序因JVM崩溃而终止,则不能依赖调用任何东西 如果程序是通过不涉及JVM的异常终止的,那么您应该能够将所有内容包装在try/catch/finally块中。finally块中的任何代码都保证在代码退出之前运行。对于例外情况,您可以

我使用的是一个许可API,它有一种方法可以从具有有限数量许可证的许可证服务器获取/释放许可证对象。在我的应用程序开始时,我调用该方法来获取许可证,但我希望确保即使我的程序突然终止/崩溃(异常、SIGTERM等),也能释放该许可证。关闭钩子是解决此问题的最佳方法吗?

如果程序因JVM崩溃而终止,则不能依赖调用任何东西


如果程序是通过不涉及JVM的异常终止的,那么您应该能够将所有内容包装在try/catch/finally块中。finally块中的任何代码都保证在代码退出之前运行。

对于例外情况,您可以将
main
的主体包装在
try/catch/block
中。要处理
SIGTERM
信号,您可以。但是,不能保证关机挂钩会因信号(如
SIGKILL
)而触发

发件人:

在极少数情况下,虚拟机可能会中止,即停止 在没有完全关闭的情况下运行。当虚拟机 机器在外部终止,例如使用
SIGKILL
信号 在Unix上或Microsoft Windows上的
TerminateProcess
调用。虚拟的 如果本机方法出错,计算机也可能会中止,例如, 损坏内部数据结构或试图访问 不存在的记忆如果虚拟机中止,则不保证 可以设置是否运行任何关机挂钩。


您可以通过从不调用Sytem.exit()来实现这一点。 在main()中,使用


@对于硬JVM崩溃,thedan是正确的。如果JVM严重崩溃或出现SIGKILL,它在退出之前将没有机会运行任何东西。在这种情况下,您无法在Java中解决这一问题。(但其他语言的情况也一样……)

但是,如果JVM响应所有非dameon线程结束、调用System.exit()、获取SIGINT等等而有序关闭,那么JVM将尝试运行关闭挂钩。在页面和中有关于Java关闭钩子机制的更多信息

finally
方法也是一个选项,但只有当有问题的线程在JVM退出之前终止时才有效。如果调用了
System.exit()
,或者JVM被信号终止,则不会发生这种情况。关机挂钩在更多情况下工作

(在我看来,
finally
实际上是对单个线程执行清理,而不是对整个应用程序执行清理。但是,如果您的应用程序只包含一个线程……或者如果它有一个负责有序关闭的主线程……那么
finally
可以用于应用程序清理。)



真正的解决方案是配置许可的API,以便许可证管理器可以检测使用许可证的应用程序实例何时消失而不释放它。这是否可能取决于许可证管理器。

您是指最后一个条款吗?
 try {
    startApp();
 } catch (Exception ex) {
      // do some logging
 } finally {
    releaseLicense();
 }