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

时间:2015-01-07 15:36:41

标签: java multithreading event-dispatch-thread

Java能否一次创建多个EDT?

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

        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已经有了一个内部调度机制来对这些事件进行分组/优先级排序。

根据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."

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

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

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

2 个答案:

答案 0 :(得分:2)

只能有一个Event Dispatch Thread!

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

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

答案 1 :(得分:1)

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

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