控制台java应用程序。有人通过任务管理器杀死java.exe进程。在应用程序终止之前,如何写入记录某些信息?
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) { ..... }
});
OR
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { ..... }
});
不要在这种情况下执行
答案 0 :(得分:6)
这是不可能的。关机挂钩只能在orderly shutdown:
中执行在极少数情况下虚拟 机器可能会中止,即停止 在没有干净地关闭的情况下跑步。 这在虚拟机时发生 例如,在外部终止 使用Unix上的SIGKILL信号或 对Microsoft的TerminateProcess调用 视窗。
您可以发送另一个触发有序关机的信号,例如SIGINT
。在应用程序没有响应后,杀死应用程序应该是最后的手段。
答案 1 :(得分:3)
已经提出了一些实用的解决方案,但另一个是在彼此监控的 2 应用程序之间打一个“最后状态”消息。当一个人死亡时,另一个人将最后收到的消息写入日志文件。用户无法使用任务管理器快速终止这两个进程。
答案 2 :(得分:2)
某种解决方案是始终将某些内容写入日志文件。这样你就可以看到Java程序的“最后一口气”。
答案 3 :(得分:2)
您可能尝试使用CreateProcess(在Windows中)通过一个小的天真(例如c ++)应用程序启动java.exe,然后此应用程序将继续运行监视java进程句柄。如果java进程消失了,它可以记录它。
答案 4 :(得分:1)
让您的用户有条不紊地关闭系统,并告诉他们停止使用任务管理器这样做。