将 SwingUtilities.invokeLater() 方法调用到执行 Swing 应用程序的主要 class 中究竟是什么?

What exactly does the call to the SwingUtilities.invokeLater() method into the main class that perform a Swing application?

我是 Swing 的新手,我对启动基于教程项目的 Swing 应用程序的主要 class 有以下疑问:

package com.caveofprogramming.designpatterns.demo1;

import javax.swing.SwingUtilities;

import com.caveofprogramming.designpatterns.demo1.controller.Controller;
import com.caveofprogramming.designpatterns.demo1.model.Model;
import com.caveofprogramming.designpatterns.demo1.view.View;

public class Application {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                runApp();
            }

        });
    }

    public static void runApp() {
        Model model = new Model();
        View view = new View(model);

        Controller controller = new Controller(view, model);
    }

}

所以这个 class 包含 main() 方法,即应用程序启动时执行的方法。

它执行 SwingUtilities.invokeLater() 方法创建一个包含 [= 的 Runnable 对象47=]() 方法本身执行 运行App() 方法,它是我的 Swing 应用程序的入口点。

我的疑问与 SwingUtilities.invokeLater() 方法的确切作用有关。究竟是做什么的?作为 invokeLater() 方法的参数创建的 Runnable 对象是什么?在我看来,它是一个自动实现 Runnable 接口的对象,但我不确定,我不清楚为什么要这样做。

你能帮我理解这个简单的 Swing 应用程序的架构究竟是如何工作的吗?

这真的是两个问题合而为一。

  1. SwingUtilities.invokeLater() 确保你想做的任何事情都发生在事件调度线程上。 Since Swing is strictly single threaded,这对于与 Swing 交互但在 EDT 中尚未 运行 的所有内容都是必需的(例如,作为事件处理程序的结果被调用)应用程序的 main() 方法就是这样一个例子,因为它在启动时由 VM 在其自己的单独线程(毫不奇怪,称为主线程)中调用。
  2. 这是一个anonymous inner class。这是创建实现 Runnable 的 class 并立即创建该 class 实例的快捷方式。 (请注意,这并不 完全 等同于这样做,有一些小但重要的细节不同。) SwingUtilities.invokeLater() 然后将把这个 Runnable Swing 事件队列中的对象,稍后将由 EDT(通常是几分钟)处理,调用您提供的 run() 方法。