通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2011-8-10
跳转到指定楼层
1#
发表于 2012-8-28 16:19:40 |只看该作者 |倒序浏览
swing的单线程机制在于所有的事件都被放到事件队列EventQueue中,由EDT来管理。
【一旦swing组件被实现(setVisiable(true)/show()/pack()或者父组件已经被实现),所有改变组件状态的代码或者依赖于组件状态的程序代码,全部需要给EDT执行。】
如果某些事件需要执行很长一段时间(操作数据库、读写文件等等),那么在EDT中执行就会产生GUI界面假死现象,这个时候就需要多线程来避免这种对用户而言非常不友好的现象,一般这段很长的等待时间过程中我们会使用等待对话框/进度条推进等等来提示用户。但是能够更新组件的只有EDT线程,那么就必须将更新这些等待对话框/进度条组件状态的执行交付给EDT。这个时候就需要SwingUilities.invokeLater()和SwingUtilities.invokeAndWait()把更新任务放入EDT管理的EventQueue中。
关于invokeLater()和invokeAndWait(),《Java2 图形设计卷 II SWING》描述如下:
【invokeLater()和invokeAndWait()之间一个重要的区别是:可以从事件派发线程(注:即EDT)中调用invokeLater(),却不能从事件派发线程中调用invokeAndWait。从事件派发线程调用invokeAndWait()所带来的问题是:invokeAndWait()锁定调用它的线程,直到可运行对象从事件派发线程中派出去并且该可运行对象的run方法激活。如果从事件派发线程调用invokeAndWait(),则将发生线程死锁的情况,因为invokeAndWait()正在等待事件派发,但是,由于是从事件派发线程中调用invokeAndWait()的,所以,直到invokeAndWait()返回后事件才能派发。】

举报本楼

本帖有 1 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

版规|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2025-8-8 20:03 , Processed in 0.079818 second(s), 17 queries , Gzip On.

Copyright © 1999-2025 C114 All Rights Reserved

Discuz Licensed

回顶部