gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:00:51 24 4
gpt4 key购买 nike

我的程序是这样的:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com