【发布时间】:2016-04-15 03:25:22
【问题描述】:
我有一个 Java 应用程序,它在 JTabbedPane 上加载和显示一个小程序。所以基本上 GUI 是:
Applet --> JPanel(AppletStub) --> JPanel --> JTabbedPane --> JFrame
我已经把这条标准线放在了 JFrame 类中:
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
这是我在 JFrame 类中应该在窗口关闭时调用的方法:
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);
tabbedPane.stopAllApplets();
dispose();
super.windowClosed(e);
}
});
然后,在我的 Tabbed Pane 类中,我有一个 arrayList 来管理 Applet:
ArrayList<PanelHolder> games = new ArrayList<>();
我像这样遍历 JPanel 的 ArrayList:
public void stopAllApplets(){
for (int i = 0; i < games.size(); i++) {
games.get(i).stopGame();
}
}
JPanel 类中的 stopGame() 方法非常简单:
public void stopGame(){
game.stop();
}
那么在实现 AppletStub 的 JPanel 类中,这里是 stop() 方法:
public void stop() {
if (applet != null) {
applet.stop();
applet.destroy();
applet = null;
}
}
但是,每当我关闭小程序时,JVM 都会继续运行并占用系统资源。我正在使用 BootLoader,它使用参数启动 JVM:
javaw -Xbootclasspath/p:"/C:/Users/Username/Documents/NetBeansProjects/Game/build/classes/" -cp "." main.Main
这是我运行几次后我的任务管理器最终的样子:
我显然没有正确关闭我的应用程序,有什么建议吗?
【问题讨论】:
-
JVM不退出的唯一原因是有一个非守护线程还在运行
-
@MadProgrammer 是有道理的。我去看看,谢谢!
-
如需尽快获得更好的帮助,请发帖 minimal reproducible example 或 Short, Self Contained, Correct Example。小程序是谁写的?你还是其他人?似乎小程序正在创建非守护线程(但这只是猜测)。