【发布时间】:2017-03-05 17:08:40
【问题描述】:
当我在没有指定任何线程优先级的情况下创建 Java Swing 应用程序时,事件分派线程是否以高于主线程的优先级运行?我理解这并不能保证主线程永远不会中断事件派发线程。
【问题讨论】:
标签: java multithreading swing
当我在没有指定任何线程优先级的情况下创建 Java Swing 应用程序时,事件分派线程是否以高于主线程的优先级运行?我理解这并不能保证主线程永远不会中断事件派发线程。
【问题讨论】:
标签: java multithreading swing
你为什么要做出这个假设?
Swing 的规则是所有更新 GUI 的代码都应该在 EDT 上执行,以便对 Swing 组件的所有更新都按顺序完成。
这个规则的原因是你无法控制一个线程何时被中断,所以你不希望另一个线程同时更新同一个 GUI 组件,这会使组件处于不一致的状态,这会导致无法复制的随机问题。
【讨论】:
是的。
EDT 以比主线程更高的优先级运行,如下所示:
import java.awt.EventQueue;
public class Test {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getPriority());
EventQueue.invokeLater(() -> {
System.out.println(Thread.currentThread().getPriority());
});
}
}
输出:
5
6
注意5 == Thread.NORM_PRIORITY 和10 == Thread.MAX_PRIORITY。
【讨论】: