1

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

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

4

2 回答 2

9

调用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() 关闭挂钩中调用,这足以导致挂钩无限期地阻塞。这将导致关机序列停止。

于 2013-02-02T03:57:56.640 回答
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);,我的主要方法中仍然存在

于 2014-04-21T19:29:03.687 回答