Java 程序在System.exit之后仍在运行

Java 程序在System.exit之后仍在运行,java,swing,Java,Swing,我在这里有点绝望。我有这个jFrame,我需要在按下Escape后关闭它。这可以通过使用keyTyped事件轻松完成。在keyTyped事件中,我尝试使用System.exit关闭窗口,但进程仍在任务管理器中运行(在netbeans中,即使我从jar文件运行,它仍在任务管理器中运行) 我尝试过dispose、setVisible(false)和其他东西,但似乎没有任何效果 编辑: 代码 注意:setup函数是一个空白函数,我在扩展此类时会覆盖它 编辑2:解决了 我发现我做错了什么。看来,在我被扩

我在这里有点绝望。我有这个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()
…为启动SWING
JFrame
的简单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();