java - 为什么 JVM 在其变量超出范围后不销毁 JFrame 对象?

标签 java swing concurrency garbage-collection event-dispatch-thread

我正处于学习 Java 的初级阶段。 到目前为止,在我阅读的所有文档中,都提到 Java 使用安全引用来访问对象而不是内存指针。 此外,当方法返回时,其局部作用域的变量将符合垃圾收集条件。

那么为什么在下面的代码中,JFrame 对象在 createFrame 方法返回后没有随窗口一起销毁?

import javax.swing.*;

public class HelloJava {
    public static void main( String[] args ) {
        createFrame();
    }

    private static void createFrame() {
        JFrame frame = new JFrame( "Hello, Java!" );
        JLabel label = new JLabel( "Hello, Java!", JLabel.CENTER );
        frame.getContentPane().add( label );
        frame.setSize( 300, 300 );
        frame.setVisible( true );
    }
}

不仅窗口可见,我还可以对该窗口执行所有操作,如拖动、最大化、最小化等。

最佳答案

因为 EDT 现在正在运行。

有关详细信息,请参阅 Concurrency in Swing尤其是:

  • Initial Threads .

    In standard programs, there's only one such thread: the thread that invokes the main method of the program class.

  • The Event Dispatch Thread .

    Swing event handling code runs on a special thread known as the event dispatch thread. Most code that invokes Swing methods also runs on this thread.

关于java - 为什么 JVM 在其变量超出范围后不销毁 JFrame 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237444/

相关文章:

java - 设置用于小程序启动的默认 JVM 参数

java - 删除二叉树——设计建议

java - 使用 ActionListener 时 NewJFrame 出现错误

java - 防止在调整 JButton 的容器大小时调整其大小

java - N+1 HTTP 调用通过同时队列进行批处理

java - 如何使用构建类或 war 文件将我的 Spring MVC Web 应用程序部署到 Apache tomat 目录中?

WildFly/JBoss 服务器上的 JavaScript 开发

java - 为什么我的文本字段没有出现?

java - 非阻塞延迟队列,Java

javascript - 使用 MVars 在 Haskell 中实现事件流