通信人家园

标题: swing 线程问题  [查看完整版帖子] [打印本页]

时间:  2012-8-28 16:19
作者: hechaoqun     标题: swing 线程问题

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()返回后事件才能派发。】

时间:  2012-8-30 10:06
作者: ine202

java部分确实比较感兴趣,先看看




通信人家园 (https://www.txrjy.com/) Powered by C114