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();
答案 0 :(得分:2)
只能有一个Event Dispatch Thread!
但是为什么你甚至想要有多个线程?即使对于重负荷"具有许多组件的面板(在我目前正在处理的应用程序中必须有1000个组件)一个EDT就足够了。请记住,您不应该在EDT上执行任何占用大量CPU时间的任务。否则你将阻止EDT更新事件,你的GUI将变得迟钝"响应用户输入。
还要记住,所有GUI组件都应该仅在EDT中创建和操作,因为许多组件不是线程保存。忽略此指南可能适用于特定任务,但迟早会出现奇怪的行为和/或崩溃!
答案 1 :(得分:1)
Swing GUI是单线程的。那个单线程是EDT。如果你想引入第二个EDT(并且仍然有GUI工作),你还必须重写很多内部Swing代码,以解决线程安全性增加的复杂性。
添加另一个EDT会为性能的未知增加(或减少)带来更多复杂性。