有没有办法设置两个或多个事件派发线程(EDT)?
Is there a way to set up two or more the event dispatch thread (EDT)?
Java 是否能够一次创建多个 EDT?
我正在尝试设置 EDT 以及它如何更新 "heavy duty" 面板的内容,其中可能嵌入了十几个面板,总共有数百个组件。目前我有
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 已经有一个内部调度机制来 group/prioritize 这些事件。
根据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();
只能有一个事件调度线程!
但是为什么你甚至想要为此拥有多个线程呢?即使对于 "heavy duty" 具有许多组件的面板(在我目前正在处理的应用程序中,必须有 1000 多个组件)一个 EDT 就足够了。请记住,您不应在 EDT 上执行任何占用大量 CPU 时间的任务。否则,您将阻止更新事件的 EDT,并且您的 GUI 将在响应用户输入时变为 "sluggish"。
另请记住,所有 GUI 组件都应仅在 EDT 内创建和操作,因为许多组件不是线程保存的。忽略此准则可能适用于特定任务,但迟早会出现奇怪的行为 and/or 崩溃!
Swing GUI 是单线程的。那个单线程就是 EDT。如果你想引入第二个 EDT(并且仍然有 GUI 工作)你还必须重写很多内部 Swing 代码以解决线程安全增加的复杂性。
添加另一个 EDT 会导致性能增加(或减少)的数量未知,从而增加复杂性。
Java 是否能够一次创建多个 EDT?
我正在尝试设置 EDT 以及它如何更新 "heavy duty" 面板的内容,其中可能嵌入了十几个面板,总共有数百个组件。目前我有
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 已经有一个内部调度机制来 group/prioritize 这些事件。
根据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();
只能有一个事件调度线程!
但是为什么你甚至想要为此拥有多个线程呢?即使对于 "heavy duty" 具有许多组件的面板(在我目前正在处理的应用程序中,必须有 1000 多个组件)一个 EDT 就足够了。请记住,您不应在 EDT 上执行任何占用大量 CPU 时间的任务。否则,您将阻止更新事件的 EDT,并且您的 GUI 将在响应用户输入时变为 "sluggish"。
另请记住,所有 GUI 组件都应仅在 EDT 内创建和操作,因为许多组件不是线程保存的。忽略此准则可能适用于特定任务,但迟早会出现奇怪的行为 and/or 崩溃!
Swing GUI 是单线程的。那个单线程就是 EDT。如果你想引入第二个 EDT(并且仍然有 GUI 工作)你还必须重写很多内部 Swing 代码以解决线程安全增加的复杂性。
添加另一个 EDT 会导致性能增加(或减少)的数量未知,从而增加复杂性。