Java Force Close Program

时间:2013-02-02 03:52:02

标签: java awt shutdown shutdown-hook

如何在退出时以编程方式强制关闭程序。 我添加了一个调用System.exit(0)的关闭钩子,但它似乎在执行它时遇到了问题。即使Jframe已关闭且执行了关闭挂钩,javaw.exe进程仍在内存中运行。

此外,当我手动关闭运行该程序的批处理文件时,Windows会抛出强制关闭消息。 图片:http://i.imgur.com/gy57OEV.png

2 个答案:

答案 0 :(得分:8)

在关机钩子中调用System.exit()毫无意义。在调用钩子之前,JVM已经决定关闭。我想从关闭钩子调用System.exit()可能有问题...

据推测,您的应用程序未关闭的原因是您的应用程序已创建其他线程,并且它们仍处于活动状态。

处理此问题的一种方法是让JFrame关闭事件(或关闭按钮)触发启动JVM关闭的内容。您的f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)代码是一种方法。它将调用System.exit ...并且当JVM关闭时,它将运行任何关闭挂钩。

另一种方法是将其他线程标记为“守护程序”线程,这意味着它们不会阻止JVM决定关闭。 (通常情况下,如果没有实时非守护程序线程,JVM会拔出插件。对于单线程应用程序,这意味着你的“主”线程...)


感兴趣的是,这就是为什么System.exit()调用在关闭钩子中有问题。

javadoc说System.exit()等同于System.getRuntime().exit(),后者的javadoc说明了这一点:

  

如果在虚拟机开始关闭序列后调用此方法,那么如果正在运行关闭挂钩,则此方法将无限期阻止。

因此,如果您在关闭钩子中调用System.exit() ,这足以导致钩子无限期地阻塞。这将导致关机顺序停止。

答案 1 :(得分:0)

System.exit()JOptionPane场景中正常运行:

Object[] options={"YES","NO"};
int selection= JOptionPane.showOptionDialog(this, "Message input", "Title",
        JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, 
        options[1]);
if(selection==JOptionPane.YES_OPTION){
    reset();
}
else if(selection==JOptionPane.NO_OPTION){
    System.exit(0);
}

但是,如上所述f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);仍存在于我的主要方法