2011-06-02 19 views

回答

0

我记得前面提到的similar question。一种可能的行动方式是使用SignalHandler。您可以阅读full article here。它似乎与IBM JVM有关,但我认为它对于Java Hotspot同样有效。

的Java的一个鲜为人知的功能是安装 自己的信号处理程序,这是 通过sun.misc.Signal 类支持的 能力的应用程序。但是,在使用sun.misc数据包 中的 类时请小心,因为它包含可能在Java发行版之间更改 的未记录的 支持类。您可以为 安装JVM未使用的任何信号 的Java处理程序。这些 信号处理程序类似于本机 处理程序,因为它们在 引发本机系统信号时调用,但它们将始终作为单独的 Java线程运行。本质上,当引发信号处理器可用的 信号时,JVM的 “信号分配器线程”被唤醒 并通知信号。分派器线程然后调用Java 方法来为安装的Java信号处理器创建并启动新的 线程。要编写处理器的Java信号 ,请定义一个类,该类使用sun.misc.Signal.handle() 方法实现sun.misc.SignalHandler接口并通过 注册处理程序。

0

使用命令$?检查返回sttaus

2

您可以在启动时编写文件并在优雅退出时再次删除文件。如果JVM消失了,但文件仍然存在,那么您就知道它已经崩溃或以非预期的方式退出。

+1

+1但是......如果您尝试正确地做到这一点,那么有很多难点。例如,您在哪里以及如何知道在哪里存储文件?例如,在OS X上,由* tmpdir *属性返回的位置可以**从一次运行改变到另一次运行。然后您需要知道文件保存位置的方法(比如使用Preferences API)。另外,这并不是因为您有权写入一些临时文件,您将在下一次运行中获得相同的权利。如果两个实例运行,等等。它可以工作,但它比你的答案听起来更像是复杂得多**。 – SyntaxT3rr0r 2011-06-02 11:05:13

+0

@ SyntaxT3rr0r:是的,你说得对,虽然复杂程度取决于需要什么类型的应用程序。对于服务器应用程序,您通常需要一些定义良好的目录,您可以在其中编写文件。对于桌面应用程序,了解由于意外关机而导致应该发生什么以提供更详细的解决方案会很有帮助。 – x4u 2011-06-02 11:55:50

0

当JVM正常关闭时,这意味着主线程已经结束。如果JVM正在关闭某些其他重新设置(例如,用户按下了Strg + C),则主线程仍在运行。因此,您可以在关闭钩子中存储对主线程的引用,并检查该线程是否仍然存在。当然,这假定主线程通常是应用程序中最后一个正在运行的线程。如果其中一个线程称为System.exit(),我不知道情况如何,但是您可以轻松找到它。

相关问题