2

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

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

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

这一定是我缺乏知识!!因为在我的脑海中,我就是不知道如何触发一个事件……你按下了一个按钮,java突然知道了?我一定错过了什么。

我第一次发问题,希望清楚

4

1 回答 1

3

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

它负责调度所有事件和重绘请求(以及其他一些事情,比如运行同步Runnable)。您采取的任何阻止 EDT 的操作都会阻止它处理这些事件,使其看起来像您的应用程序已挂起......因为基本上它已经挂起。

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

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

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

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

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

虽然了解工作原理是一个很好的目标,但您需要问自己,这重要吗(在短期内)?你知道电是如何从电灯开关到电灯的吗?还是您只关心它的作用?

了解使用它所需的规则(不要将尖锐的物体插入电源点),并在您变得更加自信时让理解来。

于 2013-03-13T04:29:32.527 回答