【问题标题】:invokeAndWait Java [duplicate]invokeAndWait Java [重复]
【发布时间】:2023-04-02 23:54:02
【问题描述】:

谁能告诉我这两个代码之间的实际区别是什么,因为它们都产生相同的结果?

代码1:

public class JLabelDemo extends JApplet {
public void init() {
    this.setSize(400, 400);
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

代码2:

public class JLabelDemo extends JApplet {
private static final long serialVersionUID = 1L;

public void init() {
    this.setSize(400, 400);
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                makeGUI();
            }
        });
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private void makeGUI() {
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

我真的没有发现生成的输出之间有任何区别。但是我看不懂代码。

那么谁能给我一个invokeAndWait方法的真实例子?

【问题讨论】:

  • 请参阅this 答案 - 它与 Swing 中事件的处理方式有关。
  • 我认为你还没有检查过 SO 中的其他答案。检查这些答案Answers1Answer2

标签: java swing event-dispatch-thread invokeandwait


【解决方案1】:

对于 code1,2 个分配和添加在任何线程调用 init() 上执行。如果这不是事件分派线程,那么可能会出现问题,因为 Swing 文档说几乎所有 Swing 的使用都应该在事件分派线程上完成。

对于 code2,对 Swing 的调用保证在事件调度线程上完成。这是做事的正确方法。它既丑陋又复杂,而且你(还)不理解它,但如果在 EDT 以外的任何线程上调用 init(),它就是正确的做事方式。

【讨论】:

  • 至于为什么可能有问题。原因如下: Swing 不是以线程安全的方式编写的。任何时候在 EDT 之外执行 Swing 代码时,您都可能会创建竞争条件。竞争条件的美妙之处在于,您的代码大部分时间都可以工作,但会意外失败。欢迎来到多线程的世界。
  • 感谢 gr8 的帮助!!
【解决方案2】:

invokeAndWait 表示它将在单独的线程中执行该代码块,因此在执行时不会阻塞主线程。它用于创建 Swing GUI。

【讨论】:

    【解决方案3】:

    您不会在小型摇摆应用程序中看到任何差异。在 UI 绘制需要较长时间和/或应用程序中涉及多个线程的较大应用程序中,您可以看到差异。

    来自 javadoc

    invokeAndWait 导致 doRun.run() 在 AWT 事件分派线程上同步执行。此调用会阻塞,直到所有待处理的 AWT 事件都已处理并且(然后)doRun.run() 返回。当应用程序线程需要更新 GUI 时,应使用此方法。不应从 EventDispatchThread 调用它。

    您也可以查看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多