在Java程序中使用多个线程需要在EDT上创建Swing对象

Ste*_*eve 2 java events swing multithreading dispatch

Re:要求在Event-Dispatch Thread上创建Swing对象.

我正在开发一个应用程序,其目的是监视和显示各种远程嵌入式服务器的状况.我是Java的新手,我对Swing对象和EDT的要求的理解是不完整的.

主GUI在EDT上以通常的方式启动,如下所示,

    javax.swing.SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            createAndShowGUI();
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后,用户可以选择与一个或另一个远程机器相对应的一个或多个菜单选项.这样做的效果是每次都创建一个新线程,如下所示

                new Thread(new VoterStatus(itemNumber)).start();
Run Code Online (Sandbox Code Playgroud)

它调用VoterStatus的类"run"方法,该方法又创建一个带有JFrame的新窗口.新线程(VoterStatus类的一个实例)然后询问(TCP等)指定的特定远程(itemNumber),收集各种信息并在JFrame中显示它们.

可能有任意数量的此类线程对应于VoterStatus的实例,所有这些都更新了自己的窗口.这些不同的窗口/ JFrame /任务之间没有数据共享.

这似乎工作得很好,但是安全吗?

我是否违反了有关在EDT上创建Swing组件的规则?

使用SwingWorker类会有益吗?

我要感谢Java程序员在这些问题上更有经验的任何评论.

谢谢Steve

cam*_*ckr 5

来自Swing教程中标题为The Event Dispatch Thread的部分

一些Swing组件方法在API规范中标记为"线程安全"; 这些可以从任何线程安全地调用.必须从事件派发线程调用所有其他Swing组件方法.忽略此规则的程序可能在大多数情况下正常运行,但会遇到难以重现的不可预测的错误.

我总是在EDT上调用我的方法,所以我不会浪费时间追逐小鬼.

编辑:

我刚刚阅读了另一篇帖子,其中指出JDK7 API中的许多方法已删除了"线程安全"注释.http://forums.oracle.com/forums/thread.jspa?threadID=2167051.这看起来是确保影响GUI的所有方法都在EDT上执行的另一个原因.

  • `repaint()`是一个在EDT之外运行总是安全的方法的一个很好的例子. (2认同)