因:什么是 EventQueue.invokeLater,需要用吗?
java.awt
类 EventQueue
java.lang.Objectjava.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)
-
导致
runnable
的run
方法在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可以减少程序引入的类。