Java 有没有办法设置两个或多个事件调度线程(EDT)?

Java 有没有办法设置两个或多个事件调度线程(EDT)?,java,multithreading,event-dispatch-thread,Java,Multithreading,Event Dispatch Thread,Java是否能够一次创建多个EDT 我正在试验设置EDT,以及它如何更新“重型”面板的内容,其中可能嵌入十几个面板,总共包含数百个组件。目前我有 public void run() { SwingUtilities.invokeLater(new Runnable() { public void run() { panel.update(); }

Java是否能够一次创建多个EDT

我正在试验设置EDT,以及它如何更新“重型”面板的内容,其中可能嵌入十几个面板,总共包含数百个组件。目前我有

        public void run() {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    panel.update();
                }
            });
        }
我看过以下帖子:

等等

我有点理解,如果一个EDT必须处理十几个事件,Java已经有了一个内部调度机制来对这些事件进行分组/排序

那么,如果我用下面的新线程(new Runnable(){…}.start()创建第二个EDT会怎么样

由于担心线程安全,java会自动将两个EDT合并回一个吗

       new Thread(new Runnable() {
        public void run() {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    panel.update();
                }
            });
        }
    }).start();

只能有一个事件分派线程

但是,为什么您甚至希望有多个线程来执行此操作?即使对于具有许多组件的“重型”面板(在我目前正在开发的应用程序中,必须有1000个组件)一个EDT就足够了。请记住,您不应该在EDT上执行任何占用大量CPU时间的任务。否则,您将阻止EDT进行更新事件,并且您的GUI将在响应用户输入时变得“迟缓”


还请记住,所有GUI组件都应仅在EDT内创建和操作,因为许多组件都不是线程保存。忽略此指导原则可能适用于特定任务,但迟早会出现奇怪的行为和/或崩溃!

Swing GUI是单线程的。该单线程就是EDT。如果您希望要引入第二个EDT(并且仍然让GUI工作),您还必须重写大量内部Swing代码,以考虑线程安全增加的复杂性


添加另一个EDT将为未知数量的性能增加(或减少)带来更大的复杂性。

您的第二个线程不是EDT,只是T.;)我认为您无法创建EDT。Swing创建自己的EDT。您可以创建任意数量的线程(最大限度),但它们不是EDT的。示例代码创建了一个
Runnable
对象,但它不会在线程中运行
panel.update
。取而代之的是,这个对象被赋予Swing,Swing将它保存在某个地方,然后EDT最终找到它并运行它。我在一个类中所做的计算可能是重复的,这个类也负责创建面板和组件。因此,我认为将GUI中的核心逻辑划分为不同的类是一个很好的实践!一般来说,您希望查看模式。还请记住,始终确保在EDT上执行GUI组件的创建和操作。大多数情况下,当您从ActionListener(在EDT上运行)中调用代码时,会自动出现这种情况,但有时您希望从不同的线程访问GUI元素,则必须使用SwingUtilities.invokeLater或SwingUtilities.invokeAndWait。
       new Thread(new Runnable() {
        public void run() {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    panel.update();
                }
            });
        }
    }).start();