回复:要求在事件派发线程上创建 Swing 对象。
我正在开发一个应用程序,其目的是监视和显示各种远程嵌入式服务器的状况。我是 Java 的新手,我对 Swing 对象和 EDT 的要求的理解并不完整。
主 GUI 以通常的方式在 EDT 上启动,如下所示,
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
用户然后可以选择对应于一个或另一个远程机器的一个或多个菜单选项。这样做的效果是每次创建一个新的线程如下
new Thread(new VoterStatus(itemNumber)).start();
它会调用 VoterStatus 类的“run”方法,该方法又会创建一个带有 JFrame 的新窗口。新线程是 VoterStatus 类的一个实例,然后询问(TCP 等)指定的特定远程(itemNumber),收集各种信息并将它们显示在 JFrame 中。
可能有任意数量的此类线程对应于 VoterStatus 的实例,所有线程都更新自己的窗口。这些不同的窗口/JFrame/任务之间没有数据共享。
这似乎工作得很好,但是安全吗?
我是否违反了关于在 EDT 上创建 Swing 组件的规则?
使用 SwingWorker 类会有好处吗?
对于在此类问题上更有经验的 Java 程序员的任何意见,我将不胜感激。
谢谢 史蒂夫
最佳答案
摘自 Swing 教程中标题为 The Event Dispatch Thread 的部分
一些 Swing 组件方法在 API 规范中被标记为“线程安全”;这些可以从任何线程安全地调用。所有其他 Swing 组件方法都必须从事件分派(dispatch)线程调用。忽略此规则的程序在大多数情况下可能会正常运行,但会出现难以重现的不可预测的错误。
我总是在 EDT 上调用我的方法,这样我就不会浪费时间追逐 gremlins。
编辑:
我刚刚阅读了另一篇文章,其中指出“线程安全”注释已从 JDK7 API 中的许多方法中删除。 http://forums.oracle.com/forums/thread.jspa?threadID=2167051 .这看起来像是确保所有影响 GUI 的方法都在 EDT 上执行的另一个原因。
关于java - Java程序中多线程的使用和vs需要在EDT上创建Swing对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858692/