gpt4 book ai didi

java - 你如何使用事件调度线程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:34:57 25 4
gpt4 key购买 nike

我了解到 swing 不是线程安全的。深入研究,我发现对 swing 组件的每次修改都必须在事件调度线程上完成,以防止与多线程相关的各种问题。然而,信息似乎就此止步了。似乎没有很好的教程来解释如何在 Internet 上的任何地方执行此操作。

将发布的代码中与其他问题相关的信息拼凑在一起,似乎我必须在我的程序中的每个 swing 修改周围放置一个不整洁的代码块(就像我自己代码中的这个例子):

try {
SwingUtilities.invokeAndWait(new Runnable() {

public void run() {
setTitle("Frame title");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

setSize(800, 480);
setLocationRelativeTo(null);
setIconImage(Toolkit.getDefaultToolkit().createImage(ClassLoader.getSystemResource("Frame icon.png")));
}
});
} catch (Exception e) {
e.printStackTrace();
}

基本上,这是对的吗?我是否必须在我的代码中对 Swing 组件的每次修改都放置该代码(或与 invokeLater 等效的代码)?

此外,为什么 Swing 不自动执行此操作?

最佳答案

诀窍是,当 swing 调用你时,它总是在 EDT 中,所以你不必担心。

但是,如果您处于计时器或由其他外部事件、主线程或您创建的任何其他线程触发的操作中,那么是的,您必须使用 invokeLater 或 invokeAndWait。

换句话说,是的,swing 会自动执行“它”。很少需要使用 invokeXx,如果 swing 在内部执行它会浪费太多时间。

许多 java 程序员从来没有弄清楚这一点,它可能会在绘制 GUI 时导致一些非常讨厌的难以发现的问题。我确实希望 swing 在您调用它时不使用 EDT 时抛出异常——如果这样做的话,Java 在涉及专业 GUI 时会享有更好的声誉,因为那里的废话会更少。

关于java - 你如何使用事件调度线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com