【问题标题】:Does the Swing event dispatch thread run at higher priority than the main thread?Swing 事件调度线程是否以高于主线程的优先级运行?
【发布时间】:2017-03-05 17:08:40
【问题描述】:

当我在没有指定任何线程优先级的情况下创建 Java Swing 应用程序时,事件分派线程是否以高于主线程的优先级运行?我理解这并不能保证主线程永远不会中断事件派发线程。

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    你为什么要做出这个假设?

    Swing 的规则是所有更新 GUI 的代码都应该在 EDT 上执行,以便对 Swing 组件的所有更新都按顺序完成。

    这个规则的原因是你无法控制一个线程何时被中断,所以你不希望另一个线程同时更新同一个 GUI 组件,这会使组件处于不一致的状态,这会导致无法复制的随机问题。

    【讨论】:

    • 这个规则的原因是为了在很大程度上避免在 Swing 中使用同步方法。
    【解决方案2】:

    是的。

    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_PRIORITY10 == Thread.MAX_PRIORITY

    【讨论】:

    • 谢谢,虽然你已经证明这对于一个实现是正确的,但我在 javadoc 中找不到任何东西来保证这对于所有实现都是正确的。
    • @espertus:你可能不会
    • @HovercraftFullOfEels 那么我猜答案是“也许”,而不是“是”。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2012-02-01
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多