SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()的区别(有什么区别)

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

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

一般,一个Swing部件要作两件事情,响应事件、显示自身。这两件事情是在同一个独立的线程 -- 事件分派线程中完成的。放在一起的目的是为了Swing中的事件处理能够一个一个地进行,并且,当部件在显示过程中不会被事件打断。

这个事件分派线程,其实是一个事件队列。其中的事件处理(包括用户触发、自身重画)不是立即执行(如果上一个事件未处理完,就会造成并发),而是排在一个事件队列里,按顺序一个接一个的执行。

invokeLater()的用意是,把要执行的内容以事件的形式排列到事件队列上,你能注意到,你写的代码中并没有执行该Runnable,而恰恰是事件队列使Runnable执行。

同样地,invokeAndWait()也是把要执行的内容添加到事件队列上,与invokeLater()不同的是,当前的线程(不是事件分派线程)调用了invokeAndWait()之后,不再执行后面的代码,而是一直等待,直到invokeAndWait有了结果。

你可能感兴趣的:(swing)