即使主线程结束,Frame如何显示

时间:2013-07-20 18:13:51

标签: java swing jframe

在主线程构成一个帧之后它会死掉,但由于事件调度程序机器JVM创建的非deamon线程不会退出。但我的问题是,一旦主线程结束它的堆栈也将消失,因此框架的引用将不再是这样,因此框架对象可以随时被垃圾收集。但这不是为什么会发生的?

1 个答案:

答案 0 :(得分:3)

正如您所注意到的:Swing事件线程是一个非守护程序线程,因此在运行时,它会阻止应用程序退出。

但是

  

但我的问题是,一旦主线程结束,它的堆栈也将消失,因此框架的引用将不再存在,因此框架对象可以随时进行垃圾收集。

这不是使对象标记为GC的原因。在活动线程中不需要对它进行活动引用,并且由于EDT而未满足此条件。

  

当没有对该对象的引用时,对象有资格进行垃圾回收。当变量超出范围时,通常会删除变量中保存的引用。或者,您可以通过将变量设置为特殊值null来显式删除对象引用。请记住,程序可以对同一个对象进行多次引用;在对象符合垃圾回收条件之前,必须删除对对象的所有引用。 ref


修改
您在评论/我的回复中说明:

  

我的意思是说第一次点击按钮,所以它的事件将进入事件队列,事件调度程序机器将为此事件创建一个EDT,它将执行动作执行的方法。

没有。一旦显示GUI,就会创建Swing EDT。因此,如果在GUI中看到该按钮,则其GUI正在创建并显示在正在运行的EDT上。按下按钮时不会创建EDT。相反,Runnables可以在事件队列上排队,由EDT处理。

  

现在执行完毕后说我再次按下按钮,事件再次进入事件队列,现在机器必须启动另一个线程,因为同一个线程无法启动两次。

再一次没有。只有一个EDT可以连续运行。除非您通过new Thread(...).start()显式创建和启动新的线程,或者在SwingWorker对象上调用execute(),否则不会创建新的线程