Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中运行shutdown钩子的问题_Java_Batch File_Logging_Cmd_Shutdown Hook - Fatal编程技术网

java中运行shutdown钩子的问题

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

我正在尝试在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中)提供一种机制来确保钩子总是被调用。它只是一些可以调用的东西,但不能保证。

强制杀死应用程序,即不优雅地杀死应用程序,因此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决定终止(如果从外部终止)


比较的已接受答案,其中包含您尝试执行的另一个示例。

关闭窗口会终止进程,因此关闭挂钩将不起作用

听起来你根本不希望这个过程被扼杀。你应该考虑使用蝙蝠以外的东西。