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有了结果

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值