我试图让一个关机钩子在Java中运行。该挂钩的目的是将程序已终止写入日志文件。 Java应用程序被编译为jar文件,并使用批处理文件执行,这意味着该应用程序的输出将进入cmd.exe窗口。当此cmd窗口关闭时,我希望应用程序记录它已关闭。
该应用程序旨在无限期运行并在特定时间执行某些任务。因此,该程序正在“ While true”循环中执行一系列检查。我不明白为什么这个钩子不会记录应用程序正在关闭!
在主要方法中,我们有:
final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
{
@Override
public void run()
{
try { mainThread.join(); }
catch (InterruptedException e) { }
mission.log("Program Closed.", true);
}
}
));
所有“任务”都是我的自定义类的实例,该类进行数据记录。当您将方法称为“ log”时,它具有BufferedWriter,并调用其.write()、. newLine()和.flush()方法。
当我终止批处理窗口时,我似乎无法在日志文件中看到“程序已关闭”行。我究竟做错了什么?
最佳答案
强行杀死应用程序,即不能正常终止,因此JVM不知道应用程序正在退出,因此不会调用关闭挂钩。
不幸的是,没有办法(至少在Windows中)提供一种机制来确保始终调用该挂钩。它只是可以被调用的东西,但是不能保证。