我最近了解到Sun的/ Oracle最新指南说没有必须在EDT之外调用任何Swing对象(包括构造函数)的Swing方法。
同样的严格标准是否也适用于所有“视觉”AWT课程?如果没有,**对他们来说是什么规则?
的后 的
< Swing和EDT:2009年的讨论。报价: “除了实际的线程安全性和相关问题,如可见性和 同步,我认为是一个软件问题。摆动组件 经常有某种类型的“听众”,而这些听众的目的是为了 在美国东部时间执行。
由于这些侦听器是异步的并且响应事件(例如 属性更改)可以让这些侦听器像你一样开火 构建您的GUI。结果是一些听众正在 当您在主线程中构建时,在EDT上执行,以及 一些侦听器也可能在其他一些线程上运行(因为 听众感到困惑,并在错误的线程上触发)。结果是 一个巨大的不可预测的混乱。“
也许他们不知道他们在谈论什么......但目前我采取的是“更安全而不是抱歉”的方法。 Potochkin,http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html似乎也认为我们熟悉后来更严格的规则答案 0 :(得分:5)
多线程Java程序中的正确同步取决于{em>发生在之前关系,在Memory Consistency Properties中进行了总结。 AWT组件意图是线程安全的,在java.awt.Component
中的私有锁对象上进行同步。从一些历史角度看评论:
private transient Object objectLock = new Object();
虽然这对于简单程序来说可能已经足够了,但是需要更复杂的程序来依赖该实现细节的知识来验证正确的同步。这是可能的,但谁愿意接受一个脆弱的AWT GUI?
其他一些要点:
@Hovercraft引用的article可以追溯到1998年,但它已经过多次更新,以解决您引用的usenet new memory model中提到的thread等问题。 / p>
javax.swing
的演变已经远离GUI API承诺,如here所提及的那样,更加灵活concurrent programming tools。
答案 1 :(得分:4)
你说:
为何选择AWT?好问题。我现在正在重写一些东西,因为所有的Swing调用都必须在EDT中完成...如果AWT稍微宽松一点,这可能会用于一些简单的GUI目的......
我的回复:
这是不好的推理。摆动是如此强大和灵活,它就像打破小狗的腿之前购买它,所以你不必走路。使用Swing,遵循几乎不可能比AWT更繁重的线程规则,并享受。线程规则是有道理的,并不难理解。同样,this article是一个很好的参考。