Java事件分派线程说明
我最近开始学习和探索Java中GUI编程的基础知识。
经过编程一段时间,我只做了后端工作或工作,因此离用户界面最近的是命令控制台(我知道令人尴尬)。
我正在使用Swing,并且据我所知,这也意味着我也使用了AWT。
我的问题是基于这段代码:
java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new frame.setVisible(true); } } );
我一直在研究这一段时间,因为我想完全理解这段奇怪的代码,并多次遇到“事件分派线程”这个术语。 纠正我,如果我错了,但据我了解; 它与使用多个线程以及Java Swing如何解释这些线程有关。 我也收集以上代码用于确保所有线程在创建窗口之前是“安全的”,因此invokeLater?
我读过:
“你只能调用在Event-Dispatching Thread上的框架上运行的方法”
只有在某些情况下,你才可以调用主方法在框架上运行的方法。
有人可以向我澄清事件调度线程究竟是什么?
它如何与多个执行线程相关联以及如何从主方法调用这些线程是不安全的? 另外为什么我们需要这个invokeLater?
我们能不能像其他物体一样创建窗户?
我在研究中遇到了一些障碍,因为我没有把握这些关系和想法。
值得一提的是,我喜欢将自己的知识建立在深入理解的基础上,因为我相信这会带来最好的总体结果,从而形成最好的计划。 如果我深入了解事情是如何工作的,那么你可以有效地使用这些提示和调整,而不是仅仅把它们再撇在代码中,所以请不要害怕给我一些额外的深入解释和拓宽我的知识。
谢谢。
EventDispatching线程是一个由AWT管理的特殊线程。 基本上它是一个在无限循环处理事件中运行的线程。 java.awt.EventQueue.invokeLater方法是提供一些将在事件队列上运行的代码的特殊方法。 编写一个在多线程环境中安全的ui框架非常困难,所以AWT作者决定只允许在一个特殊的线程上进行GUI对象的操作。 所有的事件处理程序都会在这个线程上执行,所有修改了gui的代码也应该在这个线程上运行。
现在,AWT通常不检查你是不是从另一个线程发出GUI命令(C#的WPF框架可以做到这一点)。 所以有可能编写大量的代码,并且几乎不可知论的,而不会遇到任何问题。 但是这可能会导致未定义的行为,所以最好的办法是始终确保gui代码在事件分派器线程上运行。 invokeLater提供了一个机制来做到这一点。
所以一个典型的例子就是你需要运行一个长时间运行的操作,比如下载一个文件。 所以你启动一个线程来执行这个动作,然后当它完成时你将使用invokeLater来更新UI。 如果你没有使用invokeLater,而是直接更新了UI,那么你可能会遇到竞争状态,并且可能会发生未定义的行为。
维基百科有更多信息: http : //en.wikipedia.org/wiki/Event_dispatching_thread
此外,如果您好奇为什么awt作者不只是使工具包多线程在这里是一个很好的文章: http : //weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html
EventDispatchThread
(EDT)是仅为Swing GUI保留的特殊线程,以及* Swing的相关事件,例如创建/更改/更新Swing JComponents ,更多用于此处和此处的问题
所有从BackGround Tasks
输出到GUI, Runnable#Thread
必须从同步对象包装到invokeLater()中 BackGround Tasks
invokeAndWait();