Java:对流程死亡采取行动?

时间:2011-03-12 08:12:57

标签: java

我正在调试一个Java应用程序,它经常涉及杀死进程。我想在应用程序死之前做一些清理工作。有没有办法捕捉事件并作出相应的反应? (有点像在Python中捕获KeyboardInterrupt

更新:我尝试将其添加到main(),但似乎无效:

Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                System.out.println("Closing...");
            }
        });

代码无法运行。

2 个答案:

答案 0 :(得分:2)

如果您通过Eclipse中的“停止”按钮停止该过程,则不会运行shutdown hook。据我所知,在这种情况下没有任何方法可以运行钩子 - 它几乎杀死了JVM而没有机会进行清理。如果你从命令行运行,CTRL + C会起作用,但我认为你不能在eclipse中做到这一点。

UGLY HACK:

在main的开头添加类似的内容:

    JFrame killer = new JFrame("Killer");
    killer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    killer.setSize(100, 100);
    killer.setVisible(true);

关闭生成的窗口将触发System.exit(),这应该允许关闭挂钩运行。当然,如果程序在调试器中暂停,这将不起作用。 YMMV。

答案 1 :(得分:0)

您可以尝试使用shutdown hook

请注意,这并不能保证您的钩子会被调用,因此没有防弹方法可以100%确定您的清理工作是否已经完成。

JVM可以进行清理的时间有限,如果你试图做太多事情,不要指望它会完成。

相关问题