概述Swing组件与外部线程
创始人
2024-04-16 15:01:19
0

Swing组件与外部线程介绍,先总结下最常见的一个说法;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有空没有咯。

【编辑推荐】

  1. SwingUtilities提供两个方法
  2. 浅谈Swing中的渲染器接口
  3. Swing组件中的渲染器Renderer
  4. 浅析Swing线程中的LookupEvent
  5. Swing任务在Swing线程中执行

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...