我正在调试一个Java应用程序,它经常涉及杀死进程。我想在应用程序死之前做一些清理工作。有没有办法捕捉事件并作出相应的反应? (有点像在Python中捕获KeyboardInterrupt
。
更新:我尝试将其添加到main()
,但似乎无效:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Closing...");
}
});
代码无法运行。
答案 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可以进行清理的时间有限,如果你试图做太多事情,不要指望它会完成。