EventQueue.invokeLater详解

因:什么是 EventQueue.invokeLater,需要用吗?

EventQueue.invokeLater(new Runnable(){
public void run(){
try{*/
MyAbout frame =new MyAbout();
frame.setVisible(true);
}catch(Exception e){
e.printStackTrace();
}
}
});


========================================================================
API中:

java.awt
类 EventQueue

java.lang.Object
  继承者 java.awt.EventQueue
public class EventQueue
extends Object

EventQueue是一个与平台无关的类,它将来自于底层同位体类和受信任的应用程序类的事件列入队列。

它封装了异步事件指派机制,该机制从队列中提取事件,然后通过对此 EventQueue 调用dispatchEvent(AWTEvent)方法来指派这些事件(事件作为参数被指派)。该机制的特殊行为是与实现有关的。指派实际排入到该队列中的事件(注意,正在发送到EventQueue 中的事件可以被合并)的唯一要求是:

按顺序指派。
也就是说,不允许同时从该队列中指派多个事件。
指派顺序与它们排队的顺序相同。
也就是说,如果 AWTEvent A 比 AWTEvent B 先排入到 EventQueue 中,那么事件 B 不能在事件 A 之前被指派。

一些浏览器将不同代码基中的 applet 分成独立的上下文,并在这些上下文之间建立一道道墙。在这样的场景中,每个上下文将会有一个EventQueue。其他浏览器将所有的 applet 放入到同一个上下文中,这意味着所有 applet只有一个全局EventQueue。该行为是与实现有关的。有关更多信息,请参照浏览器的文档。 

invokeLater

public static void invokeLater(Runnable runnable)
导致 runnablerun 方法在 the system EventQueue 的指派线程中被调用。
参数:
runnable - Runnable 对象,其 run 方法应该在 EventQueue 上同步执行
从以下版本开始:
1.2
另请参见:
invokeAndWait(java.lang.Runnable)
========================================================================

七嘴八舌:

使用该方式的原因是:awt是单线程模式的,所有awt的组件只能在(推荐方式)事件处理线程中访问,从而保证组件状态的可确定性。

---------------------------------------------------------------------------------------

 

使用eventqueue.invokelater()好处是显而易见的,这个方法调用完毕后,它会被销毁,因为匿名内部类是作为临时变量存在的,给它分配的内存在此时会被释放。这个对于只需要在一个地方使用时可以节省内存,而且这个类是不可以被其它的方法或类使用的,只能被EventQueue.invokeLater()来使用。但如果你需要一个在很多地方都能用到的类,而不是只在某一个类里面或者方法里用的话,定义成匿名内部类显然是不可取的。是,runnable是跟线程相关的类。

swingutilities.invokelater()和eventqueue.invokelater(),后者可以不干扰到事件分发线程.SwingUtilities版只是一个薄薄的封装方法,它直接转而调用EventQueue.invokeLater。因为Swing框架本身经常调用SwingUtilities,使用SwingUtilities可以减少程序引入的类。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值