爪哇力量关闭程序

问题描述:

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

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

+1

使用堆栈跟踪 –

+0

有似乎没有叫任何例外添加例外..它只是不关闭。 另外,当我手动关闭批处理文件时,Windows提供强制关闭消息。 – Chris

在关机挂钩中调用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()关闭挂钩正在运行该方法将无限期地阻塞。

所以,这足以引起钩到b无限期地锁定。这将导致关机顺序停止。

+0

好吧,我添加了类似'f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);'我假设会调用关机挂钩。但是,在关闭钩子中需要什么来实际关闭进程?它现在的方式只是给予力量关闭的信息。 – Chris

+0

Ooooohhh好吧,我明白你在说什么,明白了。我从关闭挂钩中删除了'System.exit(0);',现在它正确关闭。 感谢您的帮助 – Chris

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);的规定仍然存在于我的主要方法