首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java事件调度线程说明

Java事件调度线程说明
EN

Stack Overflow用户
提问于 2011-08-28 04:01:31
回答 2查看 37.2K关注 0票数 63

我最近开始学习和探索Java GUI编程的基础知识。

我已经编程一段时间了,我只做过后端的工作,因此我最接近的用户界面是命令控制台(我知道这很尴尬)。

我正在使用Swing,据我所知,这意味着我也在使用AWT。

我的问题基于这段代码:

代码语言:javascript
复制
java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new frame.setVisible(true);
    }
} );

我对此已经研究了一段时间,因为我想要完全理解这段奇怪的代码,并且多次遇到“事件分派线程”这个术语。如果我错了,请纠正我,但据我所知,这与使用多线程以及Java Swing如何解释这些线程有关。我还猜测,上面的代码是用来确保所有线程在创建窗口之前都是“安全的”,因此使用了invokeLater?

我已经读过了:

“您只能调用在事件调度线程中对帧进行操作的方法”

而且,只有在某些情况下,才能从main方法调用在框架上操作的方法。

谁能给我澄清一下事件调度线程到底是什么?

它与多线程的执行有什么关系,从main方法调用这些线程是不安全的?另外,我们为什么需要这个invokeLater?

我们不能像创建任何其他对象一样创建窗口吗?

我在研究中遇到了一些障碍,因为我没有掌握这些关系和想法。

顺便说一句,我喜欢把我的知识建立在深入理解的基础上,因为我相信这会带来最好的整体结果,从而产生最好的程序。如果我深入理解了一些东西是如何工作的,那么你就可以有效地使用这些提示和调整,而不仅仅是把它们模仿回代码中,所以请不要害怕给我一些额外的深入解释,拓宽我的知识。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-28 04:39:35

event dispatch thread是一个由AWT管理的特殊线程。基本上,它是一个在无限循环中运行的线程,处理事件。

java.awt.EventQueue.invokeLaterjavax.swing.SwingUtilities.invokeLater方法是一种提供在事件队列上运行的代码的方法。编写在多线程环境中安全的UI框架非常困难,因此AWT作者决定只允许在单个特殊线程上对GUI对象执行操作。所有事件处理程序都将在此线程上执行,所有修改GUI的代码也应在此线程上运行。

现在AWT通常不会检查您是否没有从另一个线程发出图形用户界面命令( C#的WPF框架确实会这样做),这意味着可以编写大量代码,对此几乎是不可知的,并且不会遇到任何问题。但这可能会导致未定义的行为,因此最好的做法是始终确保GUI代码在事件分派线程上运行。invokeLater提供了一种这样做的机制。

一个典型的例子是,你需要运行一个长时间运行的操作,比如下载一个文件。因此,您可以启动一个线程来执行此操作,然后在完成此操作后,使用invokeLater更新UI。如果您没有使用invokeLater,而只是直接更新了UI,那么您可能会遇到竞争情况,并且可能会出现未定义的行为。

Wikipedia has more information

此外,如果您对AWT作者为什么不使工具包成为多线程感到好奇,那么here是一篇不错的文章。

票数 71
EN

Stack Overflow用户

发布于 2011-08-28 04:54:27

EventDispatchThread是专门为Swing和*Swing的相关事件保留的线程,例如创建/更改/更新Swing JComponents,更多用于asked questions herehere

BackGround TasksRunnable#Thread到图形用户界面的所有输出都必须包装到invokeLater()中,从同步对象到invokeAndWait();

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7217013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档