如果java应用程序已关闭,但未按框架关闭

如果java应用程序已关闭,但未按框架关闭,java,Java,我正在用java开发一个桌面应用程序,当应用程序被框架关闭时,我有一个事件调用FrameClosing,当用户关闭窗口时,它会产生一个函数,问题是当应用程序被任务管理器关闭时,或者当用户关闭窗口并且应用程序正在运行时,我正在尝试这个 Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.out.println("app was stoped

我正在用java开发一个桌面应用程序,当应用程序被框架关闭时,我有一个事件调用FrameClosing,当用户关闭窗口时,它会产生一个函数,问题是当应用程序被任务管理器关闭时,或者当用户关闭窗口并且应用程序正在运行时,我正在尝试这个

Runtime.getRuntime().addShutdownHook(new Thread() {

    @Override
    public void run() {

       System.out.println("app was stoped");
    }

});
但它只有在应用程序被框架关闭的情况下才能工作。我在读一篇关于socket的文章,我的应用程序可以与一个网站进行通信,如果它们之间的通信我可以检测到程序被关闭了,但我对此并不太了解 我只想检测我的应用程序何时停止运行,但第二点很重要。如果程序是通过任务管理器或
kill-9
终止的,那么对此您真的无能为力。该计划没有访问该级别的权限,您必须让该计划专门寻找该级别

您是否考虑过设计应用程序,以使意外关机不会破坏交易,而不是试图解决这一问题?例如,在程序运行时执行中间日志记录。您可以使用它来确定应用程序在下次运行时是否过早关闭,并在开始工作之前执行任何必要的操作

你也可以看看。它说的是通过命令行杀戮,但在某些情况下可能会对你有所帮助

Logically, SIGHUP (terminal hangup) should be raised.

The equivalent of SIGHUP is provided through the callback you register with
SetConsoleCtrlHandler. Your callback function will be called on an 
arbitrary threadpool thread with dwCtrlType = CTRL_CLOSE_EVENT. You've got 
5 seconds to clean-up, you cannot cancel the close.

你的代码是正确的。如果它是通过任务管理器杀死的,尽管这是故事的结尾。它在运行System.out.println之前被杀死。如果不是这样的话,在用户说要杀死它之后,你可以做各种各样的事情。

什么应用程序?移动应用程序、web应用程序、,独立java程序?一个选项可以是第二个进程,用于检查主体是否仍然有效,但如果用户在进程打开的情况下关闭windows会发生什么情况?这可能很有用:我的应用程序向php页面发送一个请求,通知用户在应用程序关闭时已连接。发送另一个请求,通知用户已连接断开连接,但如果应用程序未关闭,则从windows nothing的X按钮断开连接happen@DarwinRosso有一个简单的解决办法:超时。你的应用程序必须每X秒向php页面发送一个信号(“心跳”)。如果没有,客户端已经关闭。我如何用java和php做到这一点?@Darwin设置了心跳协议:每隔一段时间(比如说,每秒一次),向php发送相当于“嘿,我还活着”的消息。一旦PHP在大约10秒钟内没有看到该消息,它就会自动启动关闭过程