java- 没有使用事件调度线程?

java- not using event dispatching thread?

首先,我知道有很多关于这个主题的问题,但是 none 回答了我想知道的问题。

在回答一些问题的过程中,我遇到了一个建议,即我们应该始终使用 EDT 来更新我们的 GUI。

我的问题是,

  1. 我应该什么时候使用它?请举个例子。
  2. 如果我不使用它会怎样?请举个例子。不需要代码。
  1. 事件调度线程是所有与 Swing 相关的工作应该发生的线程。如您所见,有时您可以不用明确地使用它来更新您的 UI,尽管这被认为是错误的形式。

  2. EDT 负责您的 Swing UI。它处理鼠标点击、事件、回调、window 绘图等。每次调用 ActionListener 时,它都会被 EDT 调用。

  3. 每次使用 Swing 注册侦听器时,您都在使用 EDT,即使您没有明确提及它。

    例如:

    JButton button = new JButton();
    button.addActionListener(e -> System.out.println("Clicked!"));
    

    即使您没有提及 EDT,您仍在使用它。单击按钮时从 EDT 调用侦听器。

    另一种使用 EDT 的方法是 SwingUtilities.invokeLater()。当您需要从 而不是 EDT 的线程更新 UI 时,您可以使用它。 Swing 是线程不安全的,这意味着从 EDT 外部更新 UI 是不安全的。即使在您的计算机上运行正常,也不能保证始终运行。您可以阅读更多相关问题 here.

  4. 正如我所说,不使用 EDT 是不安全的,因为 Swing 不保证线程安全。

  5. 如果您使用 Swing,那么您总是在使用 EDT。但是您可以使用 invokeLater()invokeAndWait().

    等方法在 EDT 上将任务安排到 运行