java中运行shutdown钩子的问题
我正在尝试在java中运行一个关机钩子。这个钩子的目的是将程序终止写入日志文件。java应用程序被编译成jar文件,并使用批处理文件执行,这意味着应用程序的输出进入cmd.exe窗口。关闭此cmd窗口时,我希望应用程序记录它已关闭 应用程序旨在无限期运行,并在特定时间执行特定任务。因此,程序在“While true”循环中执行一系列检查。我不明白为什么这个钩子不会记录应用程序正在关闭 在主要方法中,我们有:java中运行shutdown钩子的问题,java,batch-file,logging,cmd,shutdown-hook,Java,Batch File,Logging,Cmd,Shutdown Hook,我正在尝试在java中运行一个关机钩子。这个钩子的目的是将程序终止写入日志文件。java应用程序被编译成jar文件,并使用批处理文件执行,这意味着应用程序的输出进入cmd.exe窗口。关闭此cmd窗口时,我希望应用程序记录它已关闭 应用程序旨在无限期运行,并在特定时间执行特定任务。因此,程序在“While true”循环中执行一系列检查。我不明白为什么这个钩子不会记录应用程序正在关闭 在主要方法中,我们有: final Thread mainThread = Thread.currentThre
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中)提供一种机制来确保钩子总是被调用。它只是一些可以调用的东西,但不能保证。强制杀死应用程序,即不优雅地杀死应用程序,因此JVM不知道应用程序正在退出,因此不会调用关闭挂钩
不幸的是,没有办法(至少在Windows中)提供一种机制来确保钩子总是被调用。它只是一些可以调用的东西,但不能保证。强制杀死应用程序,即不优雅地杀死应用程序,因此JVM不知道应用程序正在退出,因此不会调用关闭挂钩
不幸的是,没有办法(至少在Windows中)提供一种机制来确保钩子总是被调用。它只是一些可以调用的东西,但不能保证。强制杀死应用程序,即不优雅地杀死应用程序,因此JVM不知道应用程序正在退出,因此不会调用关闭挂钩
不幸的是,没有办法(至少在Windows中)提供一种机制来确保钩子总是被调用。它只是可以调用的东西,但不能保证。在进程退出之前,没有办法总是执行某些东西。例如,如果您从墙上的插座拔出插头,您的计算机将立即关闭。或者,如果操作系统在CPU时间内将进程从调度程序中删除,从而终止该进程,那么它也没有机会 但是,如果删除该代码
try { mainThread.join(); }
catch (InterruptedException e) { }
然后,它将至少在某些情况下执行,例如,流程的正常终止。在这里检查主线程没有意义,因为要么关闭钩子是在主线程完成其工作后执行的(它退出了main()方法),要么主线程将继续运行,直到JVM决定终止(如果从外部终止)
比较的已接受答案,其中包含您正在尝试执行的另一个示例。在流程退出之前,无法始终执行某些操作。例如,如果您从墙上的插座拔出插头,您的计算机将立即关闭。或者,如果操作系统在CPU时间内将进程从调度程序中删除,从而终止该进程,那么它也没有机会 但是,如果删除该代码
try { mainThread.join(); }
catch (InterruptedException e) { }
然后,它将至少在某些情况下执行,例如,流程的正常终止。在这里检查主线程没有意义,因为要么关闭钩子是在主线程完成其工作后执行的(它退出了main()方法),要么主线程将继续运行,直到JVM决定终止(如果从外部终止)
比较的已接受答案,其中包含您正在尝试执行的另一个示例。在流程退出之前,无法始终执行某些操作。例如,如果您从墙上的插座拔出插头,您的计算机将立即关闭。或者,如果操作系统在CPU时间内将进程从调度程序中删除,从而终止该进程,那么它也没有机会 但是,如果删除该代码
try { mainThread.join(); }
catch (InterruptedException e) { }
然后,它将至少在某些情况下执行,例如,流程的正常终止。在这里检查主线程没有意义,因为要么关闭钩子是在主线程完成其工作后执行的(它退出了main()方法),要么主线程将继续运行,直到JVM决定终止(如果从外部终止)
比较的已接受答案,其中包含您正在尝试执行的另一个示例。在流程退出之前,无法始终执行某些操作。例如,如果您从墙上的插座拔出插头,您的计算机将立即关闭。或者,如果操作系统在CPU时间内将进程从调度程序中删除,从而终止该进程,那么它也没有机会 但是,如果删除该代码
try { mainThread.join(); }
catch (InterruptedException e) { }
然后,它将至少在某些情况下执行,例如,流程的正常终止。在这里检查主线程没有意义,因为要么关闭钩子是在主线程完成其工作后执行的(它退出了main()方法),要么主线程将继续运行,直到JVM决定终止(如果从外部终止)
比较的已接受答案,其中包含您尝试执行的另一个示例。关闭窗口会终止进程,因此关闭挂钩将不起作用 听起来你根本不希望这个过程被扼杀。你应该考虑使用蝙蝠以外的东西。