Thread专题(8) - 如何构建高效的GUI应用程序?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1026个文字,预计阅读时间需要5分钟。
本文被收录在《系列文章+架构师必备》(系列)中。中GUI程序任务必须在Swing的事件线程中运行,几乎所有GUI工具都实现为单线程化子系统,意味着所有GUI的动态都受到限制。
此文被笔者收录在系列文章 架构师必备(系列) 中
GUI程序任务必须运行在Swing的事件线程中,几乎所有的GUI工具都实现为单线程化子系统,意味着所有的GUI的活动都被限制在一个单独的线程中。
一、GUI单线程化细节
现在的GUI框架会创建一个专门的线程事件派发线程(EDT)用来处理GUI事件。多线程的GUI框架容易受死锁的影响,原因在于:
1、事件冒泡的传递机制,如果是双向的就有可能产生dead lock。
2、MVC模式不一致的锁顺序再次伴随着死锁的风险一同到来。
Swing中的线程限制
AWT和Swing提供的事件处理工具在结构上类似于单例的Executor。只有唯一的一个线程在处理GUI任务,一个任务结束才开始下一下,不会让两个任务交迭,这也是开发GUI程序重要的一点。 所有的Swing组件和数据模型都被限制在事件线程中,GUI对象不用同步,仅仅依靠线程限制来保持一致性。
Swing的组件和模型只能在事件分派线程中被创建、修改和请求。你无法从事件线程之外的地方访问表现对象,也有一些例外,如SwingUtilities.invokeLater等全局方法。
本文共计1026个文字,预计阅读时间需要5分钟。
本文被收录在《系列文章+架构师必备》(系列)中。中GUI程序任务必须在Swing的事件线程中运行,几乎所有GUI工具都实现为单线程化子系统,意味着所有GUI的动态都受到限制。
此文被笔者收录在系列文章 架构师必备(系列) 中
GUI程序任务必须运行在Swing的事件线程中,几乎所有的GUI工具都实现为单线程化子系统,意味着所有的GUI的活动都被限制在一个单独的线程中。
一、GUI单线程化细节
现在的GUI框架会创建一个专门的线程事件派发线程(EDT)用来处理GUI事件。多线程的GUI框架容易受死锁的影响,原因在于:
1、事件冒泡的传递机制,如果是双向的就有可能产生dead lock。
2、MVC模式不一致的锁顺序再次伴随着死锁的风险一同到来。
Swing中的线程限制
AWT和Swing提供的事件处理工具在结构上类似于单例的Executor。只有唯一的一个线程在处理GUI任务,一个任务结束才开始下一下,不会让两个任务交迭,这也是开发GUI程序重要的一点。 所有的Swing组件和数据模型都被限制在事件线程中,GUI对象不用同步,仅仅依靠线程限制来保持一致性。
Swing的组件和模型只能在事件分派线程中被创建、修改和请求。你无法从事件线程之外的地方访问表现对象,也有一些例外,如SwingUtilities.invokeLater等全局方法。

