为什么在显示窗口时不会终止简单的Swing应用程序?

时间:2011-03-21 13:41:50

标签: java swing

以下是一些示例代码:

import javax.swing.*;

public class MyApplicatin {
    public static void main(String args[]) {
        JFrame window = new JFrame();
        window.setSize(100,100);
        window.setVisible(true);

        System.out.println("Should terminate after printing this.");
    }
}

为什么这个小应用程序在打印完最后一行后没有终止?

我的猜测是Swing启动了一个新的非守护程序线程。我正在阅读关于必须在一个单独的线程中使用Java的GUI内容,如果Swing已经使用了一个单独的线程,为什么有人会写这个呢?

2 个答案:

答案 0 :(得分:8)

为什么要这样?通常,当您显示一个窗口时,您需要控制JVM何时退出。 JVM规范中没有任何内容表明JVM必须在main()方法结束时退出。

Oracle有some documentation on this specific issue

  

原因是AWT封装异步事件调度机制来处理AWT或Swing组件可以触发的事件。这种机器的确切行为取决于实现。特别是,它可以为其内部目的启动非守护程序帮助程序线程。实际上,这些是阻止上述示例退出的线程。

这个机器中的一个(三个)限制是这样的:

  

至少有一个活动的非守护程序线程,而应用程序中至少有一个可显示的AWT或Swing组件(参见Component.isDisplayable)。

这意味着只要有可显示的AWT / Swing组件,JVM就不会自行退出。

警告:处理所有可显示的组件必然意味着非守护程序线程已消失:

  

如果所有组件都不可显示,则取决于实现是否以及何时终止非守护程序帮助程序线程。

答案 1 :(得分:3)

你必须添加

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.dispatchEvent(new WindowEvent(window, Event.WINDOW_DESTROY));

正如Joachim所说,处理窗口也可能起到作用,但这取决于实现。在任何情况下,您都必须关闭窗口,否则应用程序将继续运行。