当前位置:  开发笔记 > 编程语言 > 正文

构建Swing/AWT小部件不是在Event Dispatch Thread上安全吗?

如何解决《构建Swing/AWT小部件不是在EventDispatchThread上安全吗?》经验,为你挑选了2个好方法。

我一直在将Substance的外观和感觉整合到我的应用程序中,并遇到了几个关于它的内部EDT(事件调度线程)检查例程的问题.Substance绝对拒绝在EDT之外构建UI类.我已经做了很多Swing/AWT,我知道关于EDT的大部分规则.我使用SwingWorker,SwingUtilties.invokeLater来修改组件.我总是认为组件可以在EDT之外构建,但必须在EDT上实现操作.换句话说,您可以在后台构造和设置默认值,但对pack/setVisible的调用必须是EDT以及操作组件的任何后续调用.

我问的原因是我有一个特别"强大"的窗口来构建,涉及许多小部件,状态和资源(许多图标).以前,我在SwingWorker的背景方法上构建了窗口,并在done方法中使窗口可见.从来没有一个问题.切换到Substance后,内部EDT检查会让我感到困惑.

我已经能够重构代码来解决这个问题.我可以在EDT上构建这不是一个好的解决方案,因为整个应用程序将阻止.我还可以进行更多的重构,并尽力在EDT之外加载所有额外的资源.

把它包装起来...... 构建 Swing/AWT小部件不是在Event Dispatch Thread上安全吗?



1> Rahel Lüthy..:

Sun在2004年改变了规则 - 之前,您被允许在EDT之外创建组件,并且只有在组件实现后才必须进入EDT .

新规则现在为:

为了避免死锁的可能性,您必须特别注意仅从事件派发线程创建,修改和查询Swing组件和模型.

我的这篇博文提供了更多细节,包括其他相关文章的链接.请注意,所有正式的Sun 示例都已被重写,并且对此非常严格.

从历史上看,可能是多核计算机作为桌面计算机的日益普及促使重新制定规则 - 线程问题在客户端堆栈上变得越来越明显,并且对EDT指南非常严格,很多从一开始就可以防止它们.



2> Esko..:

没有.

简单的原因是,即使EDT在某些罕见的情况下也喜欢死锁,一般来说,使用Swing时很容易使用户界面死锁(或者我已经被告知).我建议你阅读Kirill's(Substance dev)博客上的这三篇文章:

关于Swing EDT违规的新文章

与Swing的EDT合作的不成文规则

严格检查物质中的EDT违规

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有