java - 为什么创建了一个JFrame对象并设置为可见后,程序还没有结束执行?

标签 java multithreading swing concurrency

我的程序是这样的:

import java.awt.*;
import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(new Dimension(200, 200));
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }
}

我只是很困惑,为什么在 JVM 从 main() 退出后,我的程序没有立即结束?我注意到如果我删除行“jf.setVisible(true);”,它将结束。

它是通过垃圾收集或类析构函数等技术实现的吗?我感兴趣的是,如果我想写类似的东西,我该怎么做。

最佳答案

原因是当您在 JFrame 上调用 setVisible(true) 时,在后台启动了一个非守护线程,并且 JVM 将在所有非守护线程终止之前退出。

请在此处查看有关 AWT/Swing Threading issues 的更多信息.
它指出:

"There is at least one alive non-daemon thread while there is at least one displayable AWT or Swing component within the application (see Component.isDisplayable)."

虽然这是针对 Java 1.5 的,但我认为它仍然是有效信息。

此外,我相信事件调度线程或 EDT 不是守护线程,因此它是另一个与 Swing 关联的线程来驱动它。

编辑 1
这表明 EDT 实际上是一个非守护线程:

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class IsEdtDaemon {
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             JFrame frame = new JFrame();
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);

             System.out.printf("Is the current thread the EDT thread: %b%n",  SwingUtilities.isEventDispatchThread());
             System.out.printf("Is our EDT Thread a daemon thread:    %b%n",  Thread.currentThread().isDaemon());
         }
      });
   }
}

代码的输出是:

Is the current thread the EDT thread: true
Is our EDT Thread a daemon thread: false

关于java - 为什么创建了一个JFrame对象并设置为可见后,程序还没有结束执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7535480/

相关文章:

java - 如何在 IntelliJ IDEA 中指定 JUnit 应该使用哪个@Tag

java - 使用 setRowSelectionInterval(int, int) 后无法通过箭头键导航 JTable

java - .drawLine 未绘制到 JTabbedPane (Java) 上

python - 如何异步执行多次函数并获得第一个结果

java - AutoFilter Combobox 集合模型

java - 当 JComboBox 用作表编辑器时动态填充 JComboBox

java - 如何在另一个类中设置按钮属性和操作,并在 android 的 Activity 类中使​​用它们

java - 如何修复错误将字节码转换为 dex 原因 :com. android.dex.DexException :Multiple dex files define Lorg/apache/http/conn/ssl/AbstractVerifier?

c++ - 如何分配线程本地存储?

c++ - "release sequence"是什么意思?