什么是事件指派线程???SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()有什么区别??
请各位前辈讲解一下,不甚感激!!!!!!!

解决方案 »

  1.   

    这样做的目的是为了使部件的外观与其事件处理能够协调。比如,你点击一个按钮,并且在该按钮的onClick事件里有处理代码。那么当按钮弹起来的时候,你就会知道,处理代码执行过了。当然也会相互影响,比如,你的代码运行时间很长,你就会看到该按钮很长时间不能弹起来,并且整个这段时间整个窗体其它部件也不再对任何输入作出响应。
    有些情况下,二者的联系不是很密切,你希望部件能够立即显示或重画,而处理代码在后台运行,那么你就可以使用invokeLater。invokeLater实际上就是把处理代码放到Event-Dispatch线程之外的线程中运行,而部件可以立即执行重画操作。
    顾名思义,invokeAndWait指的是当前线程阻塞,一直等待invokeAndWait中指定的代码执行完毕之后,才接着运行,这种方式用的不多。
    我正在翻译一篇介绍这方面的文章,将在我的博客http://blog.csdn.net/Unagain发表,你可以留意一下。
      

  2.   

    invokeAndWait:后面的程序必须等这个线程(参数中的线程)的东西执行完才能执行
    invokeLater:后面的程序和这个参数的线程对象可以并行,异步地执行
    invokeLater一般用于在线程里修改swing组件的外观,因为swing组件是非同步的,所以不能在线程中直接修改,会不同步,得不到期望的效果,所以要把修改外观的代码放在一个单独的线程中,交给invokeLater:后面的程序和这个参数的线程对象可以并行,异步地执行
    invokeLater去执行。我也说不太清楚,但就是这么用的。
      

  3.   

    我认真看了一下资料,我上一个帖子的观点错误。一般,一个Swing部件要作两件事情,响应事件、显示自身。这两件事情是在同一个独立的线程 -- 事件分派线程中完成的。放在一起的目的是为了Swing中的事件处理能够一个一个地进行,并且,当部件在显示过程中不会被事件打断。这个事件分派线程,其实是一个事件队列。其中的事件处理(包括用户触发、自身重画)不是立即执行(如果上一个事件未处理完,就会造成并发),而是排在一个事件队列里,按顺序一个接一个的执行。invokeLater()的用意是,把要执行的内容以事件的形式排列到事件队列上,你能注意到,你写的代码中并没有执行该Runnable,而恰恰是事件队列使Runnable执行。同样地,invokeAndWait()也是把要执行的内容添加到事件队列上,与invokeLater()不同的是,当前的线程(不是事件分派线程)调用了invokeAndWait()之后,不再执行后面的代码,而是一直等待,直到invokeAndWait有了结果。参考:http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html