Java中的EDT,它是如何工作的,它是否像普通线程(单个或多个)一样?

时间:2013-03-13 04:23:22

标签: java multithreading swing listener event-dispatch-thread

这是一个初学者问题: 我正在开发一个使用TCP传递消息的小聊天程序,我有一个简单的GUI来显示它,我已经完成了程序,但是EDT让我很困惑......

  1. EDT的行为是否像“扩展线程”一样?我想它是一个单线程,因为我需要工作线程来处理繁重的逻辑,但显然我不能做Thread.sleep / yield(我有一个 while循环不断从输出流读取消息并附加到jTextArea,在主线程中运行,我尝试通过设置false标志终止 while循环,然后屈服于主线程 ,没用。)

  2. 我不太确定监听器是如何工作的,如果我必须写它...我可能会为每个听众启动一个线程,一听到我会处理它...但是这个肯定是错的,因为它会使EDT成为一个多线程(很多耳朵),但在此过程中单线程(只有1个大脑)

  3. 这一定是我缺乏知识!!因为在我的脑海里,我只是想不出如何发起一个事件 ...你按了一个按钮,java突然知道了?我一定错过了什么。

    我第一次发帖提问,希望很清楚

1 个答案:

答案 0 :(得分:3)

事件调度线程与Java中的任何其他Thread一样是Thread

它负责调度所有事件并重新绘制请求(以及其他一些事情,例如运行synchronized Runnable)。任何阻止EDT的操作都会阻止它处理这些事件,使它看起来像你的应用程序已挂起......因为它基本上已经存在。

与任何UI组件的所有交互必须在EDT的上下文中执行。这意味着您不应该尝试从EDT以外的任何Thread创建或更新任何UI组件。

如果您需要执行任何阻塞或耗时的操作,则应使用其他线程。 SwingWorker是一个很好的起点。

向组件添加侦听器不会创建更多线程。 EDT会将事件通知发回给听众(这是一个非常简短的解释,但概念是合理的),这是你永远不应该阻止EDT的原因之一。

如何引发事件取决于组件。例如,鼠标和键盘事件将由依赖于操作系统/实现的代码的本机部分发布到事件队列(据我所知,来自ToolKit,但我可能是错的)。

actionPerformed引发的

JButtons事件可以直接针对侦听器执行(不是通过事件队列调度),而是在EDT内执行。这是由任意数量的事件引发的,但通常是由鼠标单击和特殊键事件引起的。 JButton会收到通知,因为它会将自己注册到事件队列。

虽然了解工作原理是一个很好的目标,但你需要问问自己,是否重要(短期内)?你知道电灯从灯开关到灯的电量是多少吗?或者你只关心它吗?

了解使用它所需的规则(不要将尖锐的物体粘在强力点上),并在你变得更自信时让理解来。