1

我最近了解到 Sun 的/Oracle 的最新指南说,任何 Swing 对象(包括构造函数)的任何 Swing 方法都必须在 EDT 之外调用。

相同的严格标准是否也适用于所有“视觉”AWT 类?如果不是,那么 ** 对他们的规则是什么?

之后

关于 Swing 和 EDT:2009 年的讨论。

http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-recommend-creating-swing-components-on-the-edt.html

引用:“除了实际的线程安全以及可见性和同步等相关问题之外,我认为还有一个软件问题。Swing 组件通常具有某种类型的“侦听器”,这些侦听器旨在在 EDT 上执行。

由于这些侦听器是异步的并响应事件(如属性更改),因此可以在构建 GUI 时触发这些侦听器。结果是当您在主线程中构建时,一些侦听器正在 EDT 上执行,并且一些侦听器也可能在其他线程上运行(因为侦听器被混淆并在错误的线程上触发)。结果是一个不可预测的巨大混乱。”

也许他们不知道他们在说什么......但目前我正在采取“比抱歉更安全”的方法。Potochkin,在http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html似乎认为我们熟悉后来更严格的规则

4

2 回答 2

5

多线程 Java 程序中的正确同步取决于发生前的关系,总结在内存一致性属性中。AWT 组件旨在实现线程安全,在java.awt.Component. 请参阅评论以了解一些历史观点:

private transient Object objectLock = new Object();

虽然这对于简单的程序来说可能已经足够了,但更复杂的程序需要依赖于这个实现细节的知识来验证正确的同步。这是可能的,但谁愿意接受脆弱的 AWT GUI?

一些额外的点:

于 2012-09-14T16:47:21.197 回答
4

你说:

为什么选择 AWT?好问题。我现在正在重写所有 Swing 调用必须在 EDT 中完成的基础上......如果 AWT 稍微宽松一点,这可能对一些简单的 GUI 目的有用......

我的回答是:
这是错误的推理。Swing 更加强大和灵活,就像在购买之前折断小狗的腿一样,这样您就不必走路了。使用 Swing,遵循几乎不可能比 AWT 更繁重的线程规则,并享受。线程规则是有意义的并且不难遵循。同样,这篇文章是一个很好的参考。

于 2012-09-14T14:21:01.567 回答