34

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

我问的原因是我有一个特别“强大”的窗口要构建,涉及许多小部件、状态和资源(很多图标)。之前,我在 SwingWorker 的背景方法上构建了窗口,并在 done 方法中使窗口可见。从来没有一个问题。切换到 Substance 后,内部 EDT 检查让我很头疼。

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

结束它......在事件调度线程上构建Swing/AWT 小部件是否安全?

4

2 回答 2

40

Sun 在 2004 年更改了规则——之前,您可以在 EDT 之外创建组件,并且只有在组件实现后才需要进入 EDT 。

新规则现在如下:

为避免死锁的可能性,您必须格外小心,仅从事件调度线程创建、修改和查询 Swing 组件和模型。

我的这篇博文提供了更多详细信息,包括指向其他​​相关文章的链接。请注意,所有官方 Sun示例都已重写,并且对此非常严格。

从历史上看,多核计算机作为台式机的日益普及可能推动了规则的重新制定——线程问题在客户端堆栈上变得越来越明显,并且由于对 EDT 指南非常严格,很多他们可以从一开始就被阻止。

于 2009-01-29T12:20:22.880 回答
9

不。

原因很简单,即使是 EDT 在极少数情况下也喜欢死锁,而且通常在使用 Swing 时很容易死锁 UI(至少有人告诉过我)。我建议您阅读 Kirill(Substance 开发者)博客中的这三篇文章:

于 2009-01-29T12:02:12.513 回答