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

fo_*_*x86 5 java shutdown-hook

我正在使用获得许可的API,该API具有从具有有限数量许可证的许可证服务器获取/释放许可证对象的方法.在我的应用程序开始时,我调用该方法获取许可证,但我想确保即使我的程序突然终止/崩溃(例外,SIGTERM等)也会释放它.关闭钩子是解决此问题的最佳方法吗?

Ste*_*n C 8

@thedan对于硬JVM崩溃是正确的.如果JVM很难崩溃或者它获得了SIGKILL,那么在退出之前它将无法运行任何东西.在这种情况下,您无法用Java来解决这个问题.(但其他语言的情况也一样......)

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

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

(在我看来,finally真的是在单个线程而不是整个应用程序上执行clean.但是如果你的应用程序只包含一个线程......或者它有一个主线程负责有序关闭...那么finally可以达到应用程序清理的目的.)


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