- 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线程基础
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、事件处理器函数根据这些事件的特征,判断出用户的期望行为,然后根据期望行为
改变组件的状态,然后根据需要刷新组件外观,
触发带有特定语义的高级事件此事件继续传播下去,直至调用应用程序注册在该组件上
的处理器函数。
下图是这个过程的示意图:
上图所示意的过程简要说就是:
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 事件负责将界面更
新,所以这就使用户界面失去响应。
打一个比方,事件处理线程就像进入某城唯一的单行道一样,事件相当于汽车。有种
PAINT 汽车负责为城市运输非常重要的生活物资。但是有一天,PAINT 前面有一辆汽车突然
坏掉了,司机下来修车。但是这车太难修,一修就是几天,结果后面的PAINT 汽车无法前进,
物资无法按时运到城里。市民急了,市长虽然不停的打电话催PAINT 公司,但即使PAINT
公司多添加几辆车也没用。由于进城的唯一条路被那辆车给
占着,所以再多的PAINT 车也只能堵在路上。
3、问题解决办法
3.1
文档评论(0)