Java 事件驱动线程

Java 事件驱动线程,java,synchronization,Java,Synchronization,我经常遇到这样一个片段: { SwingUtilities.invokeLater(new Runnable() { public void run() { new tester(); // class name } }); } 我知道我们为什么要用这个,但无法理解它是怎么回事。我的意思是我不理解这个片段 (我们正在初始化运行方法下的对象,,,为什么??) 请用您正在创建的内部类实现可运行的代码来解释这一点,该实例将在AWT处理任务调度程序中排队,以便稍后

我经常遇到这样一个片段:

{

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

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

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


请用您正在创建的
内部类
实现
可运行
的代码来解释这一点,该实例将在AWT处理任务调度程序中排队,以便稍后在线程中进行处理。引用文档,
invokeLater

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

因此,在某个时刻,AWT调度程序将决定在线程中运行该Runable实例。这将引发方法
run
的执行,从而引发语句
newtester()的执行
,它只创建类
tester
的实例

对于你的具体问题

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

仅仅在
run
方法中创建一个类似乎是不对的,除非构造函数正在做很多事情,这实际上是一种不好的做法

这样做会更加直观:

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

使用您正在创建的
内部类
实现
可运行
,该实例将在AWT处理任务调度程序中排队,以便稍后在线程中处理。引用文档,
invokeLater

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

因此,在某个时刻,AWT调度程序将决定在线程中运行该Runable实例。这将引发方法
run
的执行,从而引发语句
newtester()的执行
,它只创建类
tester
的实例

对于你的具体问题

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

仅仅在
run
方法中创建一个类似乎是不对的,除非构造函数正在做很多事情,这实际上是一种不好的做法

这样做会更加直观:

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

这是在专用线程中注入一些代码的经典方法。AWT不是线程安全的(就像所有UI工具包一样),因此所有处理AWT的代码都必须在一个特定线程中执行,即事件调度线程(EDT)

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

调用
invokeLater
只是告诉EDT将
Runnable
实例排入其
EventQueue
中。轮到您排队的runnable将在EDT中执行(或者更准确地说,将执行其
run
方法)


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

这是在专用线程中注入一些代码的经典方法。AWT不是线程安全的(就像所有UI工具包一样),因此所有处理AWT的代码都必须在一个特定线程中执行,即事件调度线程(EDT)

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

调用
invokeLater
只是告诉EDT将
Runnable
实例排入其
EventQueue
中。轮到您排队的runnable将在EDT中执行(或者更准确地说,将执行其
run
方法)


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

我不会说“是将在AWT处理任务调度程序中排队的线程”。排队的根本不是线程。Just Runnable对象,其运行方法随后由事件调度线程(AWT线程)执行。@barjak nice point(+1)。我同意你的看法,线程运行对象和可运行实例是排队的。我会改变措辞。@Suhail Gupta看看新版,看看你是否能理解。如果你不知道,请让我知道到底是什么让你感到困惑。我不会说“是一个线程,将在AWT处理任务调度程序中排队”。排队的根本不是线程。Just Runnable对象,其运行方法随后由事件调度线程(AWT线程)执行。@barjak nice point(+1)。我同意你的看法,线程运行对象和可运行实例是排队的。我会改变措辞。@Suhail Gupta看看新版,看看你是否能理解。如果你不知道,请让我知道到底是什么让你困惑。