Java 程序在System.exit之后仍在运行
我在这里有点绝望。我有这个jFrame,我需要在按下Escape后关闭它。这可以通过使用keyTyped事件轻松完成。在keyTyped事件中,我尝试使用System.exit关闭窗口,但进程仍在任务管理器中运行(在netbeans中,即使我从jar文件运行,它仍在任务管理器中运行) 我尝试过dispose、setVisible(false)和其他东西,但似乎没有任何效果 编辑: 代码 注意:setup函数是一个空白函数,我在扩展此类时会覆盖它 编辑2:解决了Java 程序在System.exit之后仍在运行,java,swing,Java,Swing,我在这里有点绝望。我有这个jFrame,我需要在按下Escape后关闭它。这可以通过使用keyTyped事件轻松完成。在keyTyped事件中,我尝试使用System.exit关闭窗口,但进程仍在任务管理器中运行(在netbeans中,即使我从jar文件运行,它仍在任务管理器中运行) 我尝试过dispose、setVisible(false)和其他东西,但似乎没有任何效果 编辑: 代码 注意:setup函数是一个空白函数,我在扩展此类时会覆盖它 编辑2:解决了 我发现我做错了什么。看来,在我被扩
我发现我做错了什么。看来,在我被扩展到这个课程的课堂上,我使用了一个网络摄像头。当我调用System.exit功能时,网络摄像头的led指示灯已关闭,因此我认为不需要正确释放它,但事实上它是需要的 关闭帧时的默认行为不是退出程序,而是关闭窗口。要退出程序,您必须执行以下操作:
jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
您还可以执行以下操作:
jFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
您的
正在运行
变量需要声明为volatile
,并且需要在关闭前的某个点将其设置为false
话虽如此,该代码看起来既危险又糟糕:
Thread t = new Thread()
{
@Override
public void run()
{
running=true;
while(running)
draw();
}
};
t.start();
您没有线程。其中有sleep(…)
,因此有占用CPU的风险,并且由于您试图修改Swing事件线程的Swing状态,因此您有间歇性线程故障的危险。这对我来说意味着你想用一个摆动计时器来代替
注意,为了获得更全面的帮助,请考虑发布一个演示问题的最小代码示例。这将允许我们运行您的代码,修改它,甚至纠正它。回复前请阅读该链接,因为它提供了有关SSCCE要求的许多重要细节
您是否有任何进程仍在运行?可能是一个Swing计时器?代码是否足够小,可以用我的代码进行更新。我有一个进程正在运行,但我确保它已关闭。我在网上搜索了2个多小时,仍然找不到任何有效的东西。正在运行声明为volatile吗?它没有声明为volatile,但现在你提到了它,我测试它为volatile,仍然不起作用。不起作用。该程序仍在任务管理器中运行:(我将用我的代码进行更新。我添加了另一个选项。请重试。@benjamin.d,这完全无关。他正在调用System.exit()直接。见气垫船的答案。我发现我做错了什么。在我扩展的类中,这一个似乎使用了网络摄像头。当我调用System.exit函数时,网络摄像头led关闭,所以我认为我不需要正确释放它,但事实上它是需要的。setDefaultCloseOperation()
…为启动SWINGJFrame
的简单main工作。某些任务在后台执行(至少在Netbeans下)。使用该调整,当我单击“退出”时立即退出。我发现我做错了什么。似乎在我扩展的类中,这一个使用了网络摄像头。当我调用System.Exit函数时,网络摄像头led关闭,因此我认为我不需要正确释放它,但事实上需要它。@RicardoAlves:谢谢你的帮助日期。但我再次坚持我的建议,即注意只在Swing线程中更新Swing内容。@RicardoAlves,您的评论并没有描述代码执行系统的相关问题。我的意思是,您应该首先理解为什么您的程序在退出后仍会停止退出。忘记您的网络摄像头。首先如何设置停止线程执行一段时间并唤醒它的规则;以及主线程与子线程的关系。只有在没有子线程运行时,主线程才会退出,只有守护进程线程。@hoverCraftFullOfels,+1用于针对while
循环问题。我保证线程退出,因为我将e在system.exit()函数之前关闭运行标志。这还不够吗?
Thread t = new Thread()
{
@Override
public void run()
{
running=true;
while(running)
draw();
}
};
t.start();