【发布时间】:2015-03-05 13:18:54
【问题描述】:
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."
如果我在下面创建一个带有 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();
【问题讨论】:
-
你的第二个线程不是 EDT,只是 T。;)
-
我认为您无法创建 EDT。 Swing 创建了自己的 EDT。您可以创建任意数量的线程(最高限制),但它们不会是 EDT。您的示例代码创建了一个
Runnable对象,但它不会在您的线程中运行panel.update。相反,这个对象被交给了 Swing,它把它保存在某个地方,然后最终 EDT 找到它并运行它。
标签: java multithreading event-dispatch-thread