快速业务通道

《FilthyRichClients》读书笔记(一)-SwingのEDT - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
行。

public static void invokeAndWait(Runnable runnable)        throws InterruptedException, InvocationTargetException {      if (EventQueue.isDispatchThread()) {        throw new Error("Cannot call invokeAndWait from the event dispatcher thread");      } class AWTInvocationLock {} // 声明这个类只是锁的标志,没有其他意义      Object lock = new AWTInvocationLock();      InvocationEvent event =        new InvocationEvent(Toolkit.getDefaultToolkit(), runnable, lock,    true);      synchronized (lock) {        Toolkit.getEventQueue().postEvent(event); //添加进事件队列        lock.wait(); // block当前线程      }      Throwable eventThrowable = event.getThrowable();      if (eventThrowable != null) {        throw new InvocationTargetException(eventThrowable);      }    }

为什么要有这样一条限制?结合前文不难得出-防止死锁。如果invokeAndWait在EDT中调用,那么首先将请求压进队列,然后EDT便被block(因为它就是调用invokeAndWait的当前线程)等待请求结束通知它继续运行,而实际上请求将永远得不到执行,因为它在等待队列的调度使EDT执行它,这就陷入一个僵局-EDT等待请求先执行,请求又等待EDT对队列的调度。彼此等待对方释放锁是造成死锁的四类条件之一。Swing有意地避免了这类情况的发生。

书中也提到了同步的绘制请求,作为队列,一条基本原则就是先进先出。那么paintImmediately到底是怎样的呢?显然这个调用请求不会稍后去执行,也就是说不会插入到队列的末尾等到排在它前面的请求执行完再去执行它,而是“破坏”顺序性原则优先去执行,前面提到,Swing的事件队列相对基础的同步队列做了很多优化,那么这么说它是否被插入到队列最前面呢,也就是0这个位置?貌似也不是,书上说“已经在EDT中调用的方法中间...”,那么就是比当前正在处理的绘制请求还要优先,因为它是当前绘制请求的一部分,所以当前绘制请求(EDT正在处理的那个请求)要等它处理完成后再继续处理。(好好体会吧)

SwingWorker:推荐一篇Blog,http://blog.sina.com.cn/s/blog_4b6047bc010007so.html,作者是原Sun中国工程研究院的陈维雷先生,他对Swing的造诣非浅,他的Blog中有3篇介绍这一主题的文章,详尽程度要比该书详细得多。

最后,谈一下理解EDT对设计模式的帮助。通过上述对事件队列和EDT的分析,有这样一种体会:事件队列是一个非常好的处理并发设计模型,不仅Swing用它来处理后台,Java的很多地方都在用,只不过对于处理服务器端的并发请求有多个处理线程在等候处理请求,也就是常说的线程池。而对于单用户的桌面应用,单线程调用要比多现成API更简单,“Swing后台这样做是为了保证事件的顺序和可预见性”,而且相对于服务器,客户端桌面层的请求要少得多,所以单线程就足够应对了。

单一Thread化的访问:

通过EDT,使得不具备线程安全的Swing函数库避开了并发访问的问题。如果你也有一个不具备thread安全性的函数库并想在multithreaded环境下使用应该怎么办?只要你是从单一的thread来访问这个函数库,程序就不会遭遇到任何数据同步的问题。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号