这是一些示例代码:
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已经使用了一个单独的线程,为什么有人会写这个呢?
为什么要这样?通常,当您显示一个窗口时,您需要控制JVM何时退出.JVM规范中没有任何内容表明JVM必须在main()方法到达时退出.
Oracle 有关于此特定问题的一些文档:
原因是AWT封装异步事件调度机制来处理AWT或Swing组件可以触发的事件.这种机器的确切行为取决于实现.特别是,它可以为其内部目的启动非守护程序帮助程序线程.实际上,这些是阻止上述示例退出的线程.
这个机器中的一个(三个)限制是这样的:
至少有一个活动的非守护程序线程,而应用程序中至少有一个可显示的AWT或Swing组件(请参阅参考资料
Component.isDisplayable).
这意味着只要有可显示的AWT/Swing组件,JVM就不会自行退出.
警告:处置所有显示的组件也并不一定意味着非守护线程消失:
一旦所有组件都不可显示,一旦非守护进程帮助程序线程终止,它取决于实现.
| 归档时间: |
|
| 查看次数: |
1289 次 |
| 最近记录: |