有没有办法设置两个或多个事件派发线程(EDT)?

Is there a way to set up two or more the event dispatch thread (EDT)?

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

我正在尝试设置 EDT 以及它如何更新 "heavy duty" 面板的内容,其中可能嵌入了十几个面板,总共有数百个组件。目前我有

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

我查看了以下帖子:

Measuring "busyness" of the event dispatching thread

How does the event dispatch thread work?

Java Event-Dispatching Thread explanation

http://en.wiki2.org/wiki/Event_dispatching_thread

等等。

我有点理解,如果有十几个事件,一个 EDT 必须处理,Java 已经有一个内部调度机制来 group/prioritize 这些事件。

根据http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

"This is necessary because most Swing object methods are not "thread safe": invoking them from multiple threads risks thread interference or memory consistency errors."

如果我用下面的 new Thread(new Runnable() { ... }.start() 创建第二个 EDT 会怎样?

会不会java会因为担心线程安全而自动将两个EDT合并回一个?

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

只能有一个事件调度线程!

但是为什么你甚至想要为此拥有多个线程呢?即使对于 "heavy duty" 具有许多组件的面板(在我目前正在处理的应用程序中,必须有 1000 多个组件)一个 EDT 就足够了。请记住,您不应在 EDT 上执行任何占用大量 CPU 时间的任务。否则,您将阻止更新事件的 EDT,并且您的 GUI 将在响应用户输入时变为 "sluggish"。

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

Swing GUI 是单线程的。那个单线程就是 EDT。如果你想引入第二个 EDT(并且仍然有 GUI 工作)你还必须重写很多内部 Swing 代码以解决线程安全增加的复杂性。

添加另一个 EDT 会导致性能增加(或减少)的数量未知,从而增加复杂性。