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

mk7*_*mk7 5 java multithreading event-dispatch-thread

Java能够一次创建多个EDT吗?

我正在尝试设置EDT以及如何更新"重型"面板的内容,其中可能有十几个面板嵌入其中并且共有数百个组件.目前我有

        public void run() {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    panel.update();
                }
            });
        }
Run Code Online (Sandbox Code Playgroud)

我查看了以下帖子:

测量事件调度线程的"繁忙度"

事件派发线程如何工作?

Java事件派遣线程说明

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

等等.

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

根据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."
Run Code Online (Sandbox Code Playgroud)

那么如果我用新线程创建第二个EDT(下面的新Runnable(){...} .start()怎么办?

为了避免线程安全,java会自动将两个EDT合并为一个吗?

       new Thread(new Runnable() {
        public void run() {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    panel.update();
                }
            });
        }
    }).start();
Run Code Online (Sandbox Code Playgroud)

小智 2

只能有一个事件派发线程!

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

还要记住,所有 GUI 组件都只能在 EDT 中创建和操作,因为许多组件不是线程保存的。忽略此指南可能适用于特定任务,但迟早您会遇到奇怪的行为和/或崩溃!