我最近开始学习和探索Java中GUI编程的基础知识。
经过一段时间的编程,我只完成了后端工作或其他工作,因此,我最接近用户界面的是命令控制台(令人尴尬的是,我知道)。
我正在使用Swing,据我所知,通过扩展,我也正在使用AWT。
我的问题基于以下代码:
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new frame.setVisible(true);
}
} );
我已经研究了一段时间,因为我想完全理解这段奇怪的代码,并且多次遇到“事件分派线程”一词。如果我错了,请纠正我,但据我了解;它与使用多个线程以及Java Swing如何解释这些线程有关。我还收集到上面的代码用于在创建窗口之前确保所有线程都是“安全的”,因此invokeLater吗?
我读过:
“您只能从事件调度线程中调用在框架上运行的方法”
并且只有在某些情况下,您才能从main方法调用在框架上运行的方法。
有人可以告诉我事件调度线程到底是什么吗?
它与多个执行线程有何关系?如何从main方法调用这些线程不安全?同样为什么我们需要这个invokeLater?
我们不仅可以像其他任何对象一样创建窗口吗?
由于我没有掌握这些关系和想法,因此在研究中遇到了一些障碍。
附带说明的是,我希望将自己的知识基于深入的了解,因为我相信这会带来最佳的总体结果,因此也是最好的程序。如果我深入了解某些东西是如何工作的,那么您可以有效地使用技巧和调整,而不仅仅是将它们重新编写为代码,因此请不要害怕给我一些额外的深入解释并扩大我的知识。
谢谢。
该事件调度线程是由AWT管理一个特殊的线程。基本上,它是一个无限循环运行的线程,用于处理事件。
该java.awt.EventQueue.invokeLater
和javax.swing.SwingUtilities.invokeLater
方法的方式来提供,这将在事件队列运行代码。编写在多线程环境中安全的UI框架非常困难,因此AWT作者决定只允许对GUI对象的操作在单个特殊线程上进行。所有事件处理程序都将在此线程上执行,并且修改GUI的所有代码也应在该线程上运行。
现在,AWT通常不会检查您是否从另一个线程发出了GUI命令(C#的WPF框架确实执行了此操作),这意味着可以编写很多代码,并且对此非常了解,并且不会遇到任何问题。但这可能导致不确定的行为,因此,最好的办法是始终确保GUI代码在事件分发线程上运行。invokeLater
提供了执行此操作的机制。
一个经典的例子是您需要运行长时间运行的操作,例如下载文件。因此,您启动了一个线程来执行此操作,然后在完成操作后使用它invokeLater
来更新UI。如果不使用invokeLater
,而是直接更新了UI,则可能会出现竞争状况,并且可能发生未定义的行为。
另外,如果您很好奇为什么AWT作者不只是使工具包成为多线程,那么这里是一篇不错的文章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句