`
flyPig
  • 浏览: 138740 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Swing EDT线程思考

阅读更多
先总结下最常见的一个说法;swing是单线程的。
我的理解就是,一旦swing组件被实现(setVisiable(true)/show()/pack()或者父组件已经被实现),所有改变组件状态的代码或者依赖于组件状态的程序代码,全部需要给EDT执行。在这之前可以由多少个线程调都无所谓。所有的swing组件都认为只有EDT才会调用它们,为此组件的方法都是不做同步处理的。为什么这么做呢。在我的另一篇blog 中有提到worker thread模式,当只有一个worker thread时候,可省略掉共享互斥的开销,极大的提高性能,这就是Event-dispatching thread的实质。它的具体作用大概归纳下。
1.会调用处理事件的listener
比如单击一个button的时候,ActionEvent实例被放入到EventQueue中。EDT从EventQueue中获取到这个事件,就会调用用来处理这个事件的listener中的actionPerformed方法。而这时候EDT是不知道 actionPerformed到底会做什么事情的,它仅仅是单纯的去执行它而已。追溯上去,可以明白给一个Component注册的Listener,其实就是对Component设置当某个事件发生的时候,EDT所调用的方法所在的实例。

2.重绘画面paint或者update
当我们想重绘画面的时候,会去调用repaint.其实调用repaint并不是马上去画,而是记录下要绘制的区域,具体的绘制还是由EDT操刀完成。revalidate也是类似。因此在组件被实现后,repaint,revalidate还有一大堆的addXXXListener,removeXXXListener等都可被其他线程效用。


再总结下两个非常重要的方法invokeAndWait和invokeLater,它们传入参数都是Runnable对象。
invokeAndWait会等待Runnable执行完毕才返回。也就是,外部线程调用这个方法后,就会处于阻塞状态,如果EventQueue还有其他的事件,需要它们全部被执行完成,这时候轮到EDT来执行Runnable对象,等它也执行完了,调用invokeAndWait的外部线程才会继续活动。

invokeLater就耿直多了,直接把Runnable塞到EventQueue中就完事了,至于什么时候执行,看EDT有空没有咯。
分享到:
评论

相关推荐

    基于swing的多线程聊天室

    3. Event Dispatch Thread(事件分发线程):Swing是单线程的,所有对组件的操作必须在EDT上进行,以确保界面的同步更新。 二、多线程技术 1. 用户界面线程:主GUI运行在EDT上,负责处理用户输入和显示UI更新。 2. ...

    几个swing多线程的例子

    在 Swing 中,EDT 是一个用户线程,负责处理所有的UI事件。 1. **Event Dispatch Thread (EDT)**: EDT 是 Swing 的核心,它负责接收并处理所有与用户交互相关的事件。为了保证界面的响应性,所有的 UI 更新都必须在...

    Swing线程基础经典

    - 从非EDT线程访问UI组件可能导致不一致的视图和数据模型,甚至抛出`IllegalStateException`。 - 长时间运行的任务会阻塞EDT,造成界面假死。 4. **解决办法** - **方法一:异步处理** - 使用`SwingUtilities....

    Swing线程基础.pdf

    - 不要在非EDT线程中直接访问UI组件或其事件处理器,这可能导致界面错误。 - 长时间运行的任务会阻止EDT处理其他事件,导致界面无响应。 - 使用`SwingUtilities.invokeLater()`或`invokeAndWait()`方法在EDT中安全地...

    Javaswing多线程.zip

    在Swing中,我们通常使用`javax.swing.Timer`类来实现这种定时任务,因为它与Swing事件调度线程(Event Dispatch Thread, EDT)协同工作,确保了UI更新的线程安全。 以下是一些关于Java Swing和多线程的关键知识点...

    Swing 线程之SwingUtilities invokeLater docx

    Swing 组件是线程不安全的,这意味着只能从事件派发线程(Event Dispatch Thread,简称 EDT)访问将要在屏幕上绘制的 Swing 组件。如果从其他线程访问 Swing 组件,将会导致程序崩溃或出现不可预测的结果。 在上面...

    Java开发中的线程安全选择与Swing

    如果在非EDT线程中直接操作Swing组件,则可能导致应用程序崩溃或行为异常。 #### 解决方案:SwingUtilities.invokeLater() 和 invokeAndWait() 为了确保Swing组件的操作是在EDT中执行,Swing提供了`SwingUtilities...

    Swing中的线程研究.pdf

    - **更新界面**:如果需要在非EDT线程中修改GUI组件,如`jLabel1.setText("blabla")`,必须使用`SwingUtilities.invokeLater()`来调度任务。这是因为Swing的线程安全规则,只有在EDT中才能直接修改组件。 - **...

    JAVA 开发 Swing与多线程

    Swing的单线程模型基于"事件派发线程"(Event Dispatch Thread, EDT),所有Swing组件的渲染和事件处理都在这个线程中进行。这是因为GUI组件通常不支持线程安全的操作,多线程环境下可能会导致组件状态的不一致,...

    Swing线程基础可用.pdf

    2. **UI事件调度线程 (EDT, Event Dispatch Thread)**:EDT是Swing程序的核心,它负责处理所有的GUI更新和用户交互。所有的事件处理器都在EDT上运行,确保UI组件的绘制和更新是线程安全的。由于EDT是单线程的,因此...

    Java Swing 线程 下雪效果

    这些事件由事件调度线程(Event Dispatch Thread, EDT)处理,EDT负责更新UI并确保其线程安全。然而,复杂的计算或长时间运行的任务不应在EDT上执行,因为这会阻塞用户界面的更新,造成程序响应迟钝。 线程在这里的...

    Swing线程之SwingUtilities.invoke

    Swing线程机制是Swing库中的关键概念,它确保了所有对Swing组件的操作都在正确的线程——事件分发线程(Event Dispatch Thread,简称EDT)上执行,以避免线程安全问题和界面更新不一致的情况。`SwingUtilities....

    swing 显示时间

    这里需要注意的是,由于Swing不是线程安全的,所以我们不能直接在非EDT(Event Dispatch Thread)线程中修改UI。因此,我们在`TimerTask`的`run`方法中使用`SwingUtilities.invokeLater`来确保UI更新操作在EDT中执行...

    Swing线程的深入理解和SwingWorker基础知识介绍[参照].pdf

    在 Swing 中,所有的 GUI 组件都是在一个单独的线程中执行的,这个线程被称为 Event Dispatch Thread(EDT)。EDT 负责处理所有的 GUI 事件,例如鼠标点击、键盘输入等。开发者可以使用 Swing 组件来创建用户界面,...

    java多线程聊天室(使用swing)

    Swing是线程不安全的,因此所有的UI操作必须在事件分发线程(Event Dispatch Thread, EDT)上进行,以避免界面组件的同步问题。 2. **工作线程**:处理非UI任务,如接收和发送聊天消息。通过使用Thread类或者...

    多线程抢红包带SwingUI

    此外,Swing的Event Dispatch Thread (EDT)机制保证了所有的界面更新都在同一线程中执行,避免了界面卡顿和不一致的现象。 项目的实现可能包括以下几个步骤: 1. 创建Swing UI,包含红包列表展示区、抢红包按钮等...

    一个适合学习Swing和多线程下载的程序

    Swing是线程安全的,这意味着它设计时考虑到了多线程环境,但为了防止UI更新与业务逻辑混淆,通常推荐使用Event Dispatch Thread (EDT) 来处理UI组件的更新。 多线程下载涉及到并发控制和资源管理。在Java中,我们...

    Swing组件的DnD拖拽深度分析

    而EDT,又称为事件分发线程,是Swing的核心,负责调度和执行所有的GUI事件,包括用户界面的更新和事件处理。在DnD操作中,所有与用户交互相关的事件都在EDT上执行,以确保界面的线程安全和响应性。 Swing的DnD机制...

Global site tag (gtag.js) - Google Analytics