0

我对了解摇摆和 EDT 的探索再次继续……

由于 EDT 是唯一的 EDT,我现在想知道哪些方法、构造函数和任何其他东西应该在 EDT 中完成。我知道一般规则,几乎所有创建或与 Swing 组件交互的代码都必须在事件调度线程上运行,但这是非常普遍的。也有人说任何非线程安全的摇摆代码都应该在 EDT 上执行。但我仍然无法分辨哪些方法是线程安全的,哪些不是。

我的问题是,是否有最终将在 EDT 上排队的命令列表?(我这么说是因为您不必从 EDT 调用 repaint(),但它会在它上面执行,而且永远不会少)。

如果我知道我的方法将在哪里执行(并且我可以估计相对于其余代码的时间),我可以编写更有效和更易于理解的代码。

到目前为止,我的大部分 EDT 工作都是在黑暗中进行的,因此编写了错误的代码,然后,当我无法弄清楚时,通常会惹恼这里的人。

那么是否有一个列表,也许是我错过的 Javadocs 中的某些内容?也许一些更具体的规则(例如,如果方法的名称中有一个“e”,它必须在特定的 EDT 类型上执行)?

4

1 回答 1

2
  • 没有什么复杂、奇怪或神秘的东西,EDT 一直存在,直到所有事件都完成,

  • 如果 EDT 中的所有事件都已完成,则 SwingUtilities.isEventDispatchThread() 总是返回 false

  • 注意鼠标和键事件可以为 EDT 生成一个新事件(一些 JComponents 在内部对这些事件做出反应,在 API 中实现的通知器向 EDT 触发一个新事件,然后 EDT 是活动的,例如容器中的 JButton 并且没有来自 ButtonModel 的焦点触发事件,对 Java6 有效,在 Win7 和更高版本中永远不会),是否添加了 XxxListener 无关紧要,必须在没有的情况下进行测试

  • invokeLater() 使用 Thread.sleep(int) 在所有情况下都存活 EDT,不包括冻结

  • Thread.sleep(int) 可能导致在 sleep() 期间丢失所有事件,或者 Swing GUI 仅在 Mouse_Hover_Over 上刷新

编辑

  • 在 Java7 中可以创建SecondaryLoop,但我错过了这个接口的真正原因,因为所有事件仍然必须在 EDT 上完成,可以在 Java1.4 中创建与 Java7 相同的多线程

  • 在 Java7 中,一些线程安全的方法与 WinXP 上的 Java6 的 MetalLookAndFeel 相比不是线程安全的

于 2013-03-31T21:27:58.953 回答