必须在EDT中调用AWT类中的所有方法,即非Swing方法吗?

时间:2012-09-14 13:29:04

标签: java swing awt event-dispatch-thread

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

同样的严格标准是否也适用于所有“视觉”AWT课程?如果没有,**对他们来说是什么规则?

< Swing和EDT:2009年的讨论。

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

报价: “除了实际的线程安全性和相关问题,如可见性和 同步,我认为是一个软件问题。摆动组件 经常有某种类型的“听众”,而这些听众的目的是为了 在美国东部时间执行。

由于这些侦听器是异步的并且响应事件(例如 属性更改)可以让这些侦听器像你一样开火 构建您的GUI。结果是一些听众正在 当您在主线程中构建时,在EDT上执行,以及 一些侦听器也可能在其他一些线程上运行(因为 听众感到困惑,并在错误的线程上触发)。结果是 一个巨大的不可预测的混乱。“

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

2 个答案:

答案 0 :(得分:5)

多线程Java程序中的正确同步取决于{em>发生在之前关系,在Memory Consistency Properties中进行了总结。 AWT组件意图是线程安全的,在java.awt.Component中的私有锁对象上进行同步。从一些历史角度看评论:

private transient Object objectLock = new Object();

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

其他一些要点:

答案 1 :(得分:4)

你说:

  

为何选择AWT?好问题。我现在正在重写一些东西,因为所有的Swing调用都必须在EDT中完成...如果AWT稍微宽松一点,这可能会用于一些简单的GUI目的......

我的回复:
这是不好的推理。摆动是如此强大和灵活,它就像打破小狗的腿之前购买它,所以你不必走路。使用Swing,遵循几乎不可能比AWT更繁重的线程规则,并享受。线程规则是有道理的,并不难理解。同样,this article是一个很好的参考。