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

Geo*_*lly 5 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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Joa*_*uer 8

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

Oracle 有关于此特定问题的一些文档:

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

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

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

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

警告:处置所有显示的组件也并不一定意味着非守护线程消失:

一旦所有组件都不可显示,一旦非守护进程帮助程序线程终止,它取决于实现.