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)
我查看了以下帖子:
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 中创建和操作,因为许多组件不是线程保存的。忽略此指南可能适用于特定任务,但迟早您会遇到奇怪的行为和/或崩溃!