这是一个初学者问题: 我正在开发一个使用TCP传递消息的小聊天程序,我有一个简单的GUI来显示它,我已经完成了程序,但是EDT让我很困惑......
EDT的行为是否像“扩展线程”一样?我想它是一个单线程,因为我需要工作线程来处理繁重的逻辑,但显然我不能做Thread.sleep / yield(我有一个 while循环不断从输出流读取消息并附加到jTextArea,在主线程中运行,我尝试通过设置false标志终止 while循环,然后屈服于主线程 ,没用。)
我不太确定监听器是如何工作的,如果我必须写它...我可能会为每个听众启动一个线程,一听到我会处理它...但是这个肯定是错的,因为它会使EDT成为一个多线程(很多耳朵),但在此过程中单线程(只有1个大脑)
这一定是我缺乏知识!!因为在我的脑海里,我只是想不出如何发起一个事件 ...你按了一个按钮,java突然知道了?我一定错过了什么。
我第一次发帖提问,希望很清楚
答案 0 :(得分:3)
事件调度线程与Java中的任何其他Thread
一样是Thread
。
它负责调度所有事件并重新绘制请求(以及其他一些事情,例如运行synchronized Runnable
)。任何阻止EDT的操作都会阻止它处理这些事件,使它看起来像你的应用程序已挂起......因为它基本上已经存在。
与任何UI组件的所有交互必须在EDT的上下文中执行。这意味着您不应该尝试从EDT以外的任何Thread
创建或更新任何UI组件。
如果您需要执行任何阻塞或耗时的操作,则应使用其他线程。 SwingWorker
是一个很好的起点。
向组件添加侦听器不会创建更多线程。 EDT会将事件通知发回给听众(这是一个非常简短的解释,但概念是合理的),这是你永远不应该阻止EDT的原因之一。
如何引发事件取决于组件。例如,鼠标和键盘事件将由依赖于操作系统/实现的代码的本机部分发布到事件队列(据我所知,来自ToolKit
,但我可能是错的)。
actionPerformed
引发的 JButtons
事件可以直接针对侦听器执行(不是通过事件队列调度),而是在EDT内执行。这是由任意数量的事件引发的,但通常是由鼠标单击和特殊键事件引起的。 JButton
会收到通知,因为它会将自己注册到事件队列。
虽然了解工作原理是一个很好的目标,但你需要问问自己,是否重要(短期内)?你知道电灯从灯开关到灯的电量是多少吗?或者你只关心它吗?
了解使用它所需的规则(不要将尖锐的物体粘在强力点上),并在你变得更自信时让理解来。