事件驱动线程

时间:2011-03-17 12:30:29

标签: java synchronization

我经常遇到这个片段:

{

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

}

我知道为什么我们使用它,但无法理解它是怎么回事。我的意思是我不理解这个片段。

(我们在run方法下初始化对象,,,为什么??)

请解释一下

2 个答案:

答案 0 :(得分:3)

使用该位代码创建一个实现Inner Class的{​​{1}},该实例将在AWT处理任务调度程序中排队,以便稍后在线程中处理。引用文档Runnable ...

  

导致执行doRun.run()   在AWT事件上异步   调度线程。这将发生   在所有未决的AWT事件发生之后   处理。

因此,在某些时候,AWT调度程序将决定在一个线程中运行Runable的该实例。这将激发方法invokeLater的执行,从而执行语句run,它只是创建类new tester();的实例。

针对您的具体问题......

  

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

tester方法中创建一个类似乎是不对的,除非构造函数做了很多实际上是不好的事情。

执行以下操作会更直观:

run

答案 1 :(得分:1)

这是在专用线程中注入一些代码的经典方法。 AWT不是线程安全的(因为所有的UI工具包都是),因此所有处理AWT的代码都必须在spoccial线程中执行,即Event Dispatch Thread(EDT)。

为此,AWT在EDT中有一段“代码片段”:EventQueue。 EDT只是一个循环,它将下一个要执行的“代码段”出列,然后运行它。这些“代码片段”实际上只是Runnable个实例。这些可以是您作为开发人员给他的UI事件(鼠标,键盘)或代码。

致电invokeLater只是告诉EDT将Runnable实例排入其EventQueue。你排队的可运行的东西将在EDT中被执行(或者更确切地说,它将被执行run方法),当轮到它时。

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