事件驱动的主题

问题描述:

我经常遇到这样的代码片段:事件驱动的主题

{ 

SwingUtilities.invokeLater(new Runnable() 
    { 
    public void run() { 
    new tester(); // class name 
    } 
}); 

} 

我知道我们为什么要使用这个,但无法理解它是如何going.I的意思我不明白这个片段。

(我们欠运行方法的初始化对象,,,为什么?)

请解释这

随着代码,您要创建一个Inner Class实现Runnable该位,该实例将被排队在AWT处理任务调度程序*以后在线程中处理。引用文档,invokeLater ...

导致doRun.run()要在分派线程AWT事件 异步执行 。在处理完所有待处理的AWT事件后,将会发生 。

因此,在某些时候,AWT调度器会决定在一个线程中运行该Runable实例。这将激发方法run的执行,并因此执行陈述new tester();,该语句仅创建类tester的实例。

为了您的具体问题......

我们正在运行 方法的初始化对象,,,为什么?

这真的看起来不正确在run方法只创建一个类,除非构造函数做很多事情实际上是一个不好的做法。

It'be更直观地做一些事情,如:

SwingUtilities.invokeLater(new Runnable() 
    { 
    public void run() { 
    Tester t = new Tester(); 
    t.doSomeStuff(); 
    } 
}); 
+0

无法理解:( – 2011-03-17 13:18:19

+1

我不会说“是一个线程将被放入AWT处理任务调度器中”),排队的线程根本不是线程,只是Runnable对象,其运行方法由事件调度线程(AWT线程) – barjak 2011-03-17 13:22:48

+0

@barjak很好的一点(+1)我同意你的观点,线程运行对象并且Runable实例进入队列,我将改变这个措辞。 – 2011-03-17 13:54:23

这是一个专用线程注入一些代码的传统方式。 AWT不是线程安全的(因为所有UI工具包都是),因此所有处理AWT的代码都必须在spêcial线程(Event Dispatch Thread,EDT)中执行。

为了这样做,AWT有“代码段”中的EDT被称为队列:所述EventQueue。 EDT只是一个循环,让下一个“代码段”执行并运行它。这些“代码段”实际上只是Runnable实例。这些可以是UI事件(鼠标,键盘)或代码,您作为开发人员给他。

调用invokeLater只是告诉美国东部时间在其EventQueue排队Runnable实例。你排队的可运行将在美国东部时间,何时会轮到被执行(或者更确切地说它run方法将被执行)。

通过代码从一个线程到另一个的这种方式是很常见的和有用的:它的序列化的代码片段来自不同的线程的一个好方法。唯一需要线程安全的是队列本身。