- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程基础
Swing 线程基础
1、Swing 应用程序中线程介绍
一个 Swing 程序中一般有下面三种类型的线程:
* 初始化线程 (Initial Thread)
* UI 事件调度线程 (EDT ,Event Dispatch Thread)
* 任务线程 (Worker Thread)
每个程序必须有一个 main 方法,这是程序的入口。该方法运行在初始化或启动线
程上。初始化线程读取程序参数并初始化一些对象。
在许多 Swing 程序中,该线程主要目的是启动程序的图形用户界面 (GUI)。一旦 GUI 启
动后,对于大多数事件驱动的桌面程序来说,初始化线程的工作就结束了。
Swing 程序只有一个用 EDT,该线程负责 GUI 组件的绘制和更新,通过调用程序
事件处理器来响应用户交互。所有事件处理都是在 EDT 上进行的,程序同 UI 组件和其基本
数据模型的交互只允许在 EDT 上进行,所有运行在 EDT 上的任务应该尽快完成,以便UI 能
及时响应用户输入。
Swing 编程时应该注意以下几点:
1.从其他线程访问 UI 组件及其事件处理器会导致界面更新和绘制错误。
2.在EDT上执行耗时任务会使程序失去响应,这会使GUI事件阻塞在队列中得不到处理。
3.应使用独立的任务线程来执行耗时计算或输入输出密集型任务,比如同数据库通信、
访问网站资源、读写大树据量的文件。
总之,任何干扰或延迟 UI 事件的处理任务,只应该出现在独立任务线程中;
在初始化线程或任务线程同 Swing 组件或其缺省数据模型进行的交互都是非线程
安全性操作。
2、Swing 线程中 EDT 线程运行机制
既然初始化线程和任务线程都不应该同 Swing 组件或其缺省数据模型进行进行交
互,那么如何才能够使和 Swing 交互的任务在 EDT 中运行呢?这时候就应该知道 EDT(Event
Dispatch Thread)的机制了。
Swing 的事件处理过程为:
1、事件调度线程 (Event Dispatch Thread)从事件队列(EventQueue)中获取底层系
统捕获的原生事件,如鼠标、键盘、焦点、PAINT 事件等;
2、接着调用该事件源组件 dispatchEvent 方法,该方法过滤出特殊事件后,调用
processEvent 方法进行处理;
3、processEvent 方法根据事件类型调用注册在这个组件上的相应事件处理器函数;
4、事件处理器函数根据这些事件的特征,判断出用户的期望行为,然后根据期望
行为改变组件的状态,然后根据需要刷新组件外观,
触发带有特定语义的高级事件此事件继续传播下去,直至调用应用程序注册在该组
件上的处理器函数。
下图是这个过程的示意图:
第 1 页第 1 页
线程基础
上图所示意的过程简要说就是:
Pump an Event - Dispatch Process Event - MouseListener.mousePressed
- fireActionPerformed - ActionListener.actionPeformed -Do database query
and display result to a table - Return from actionPerformed - Return from
fireActionPerformed - Return from MouseListener.mousePressed - Pump another
Event.
事件调度线程在应用程序事件处理函数 actionPerformed 没有完成之前是不能处
理下一个事件的,如果应用程序处理函数是一个时间复杂的任务(比如查询数据库并将结果
显示到表格中),后面包括 PAINT 事件将在长时间内得不到执行。由于PAINT 事件
文档评论(0)