为什么JVM在变量超出范围之后不会销毁JFrame对象?

时间:2012-09-02 15:59:24

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

我正处于学习Java的初级阶段。 在我读过的所有文档中,它都提到Java使用安全引用来访问对象而不是内存指针。 而且当一个方法返回时,它的本地范围变量就有资格进行垃圾收集。

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

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 );
    }
}

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

2 个答案:

答案 0 :(得分:6)

因为EDT现在正在运行。

有关详细信息,请参阅Concurrency in Swing&特别是:

  • Initial Threads

      

    在标准程序中,只有一个这样的线程:调用程序类的main方法的线程。

  • The Event Dispatch Thread

      

    Swing事件处理代码在称为事件派发线程的特殊线程上运行。大多数调用Swing方法的代码也在这个线程上运行。

答案 1 :(得分:6)

JFrame对象未被销毁,因为UI线程或所谓的Event Dispatch Thread具有对它的引用并正在使用它。

相关问题