Java EDT特定方法和其他材料

Java EDT特定方法和其他材料,java,swing,event-dispatch-thread,Java,Swing,Event Dispatch Thread,我对swing和EDT的理解再次继续 由于EDT是唯一的EDT,我现在想知道哪些方法、构造函数和其他东西应该在EDT中完成。我知道一般规则,几乎所有创建Swing组件或与之交互的代码都必须在事件调度线程上运行,但这是非常一般的。还有人说,任何非线程安全的swing代码都应该在EDT上执行。但我仍然无法区分哪些方法是线程安全的,哪些不是 我的问题是,是否有最终将在EDT上排队的命令列表?(我这么说是因为您不必从EDT调用repaint(),但它将永远在EDT上执行) 如果我知道我的方法将在何处执行

我对swing和EDT的理解再次继续

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

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

如果我知道我的方法将在何处执行(并且通过它我可以估计相对于代码其余部分的时间),我就可以生成更高效、更易于理解的代码

到目前为止,我大部分的EDT工作都是在黑暗中进行的,因此产生了错误的代码,然后,当我弄不明白的时候,通常会让这里的人非常恼火

那么是否有一个列表,也许是Javadocs中我遗漏的东西?可能是一些更具体的规则(例如,如果方法的名称中有一个“e”,则必须在特定的EDT类型上执行)?

  • 没有复杂、奇怪或不确定的事情,EDT在所有事件完成之前都是活着的

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

  • 请注意,鼠标和按键事件可以向EDT生成新事件(一些JComponents在内部对这些事件作出反应,在API中实现的通知程序向EDT触发新事件,然后EDT处于活动状态,例如容器中的JButton和ButtonModel中的无焦点触发事件,在Java6中有效,在Win7和更新版本中永远不会),不管是否添加了XxxListener,都要测试而不必测试

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

  • sleep(int)可能导致在sleep()期间丢失所有事件,或者仅在鼠标悬停时刷新Swing GUI

编辑

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

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


这个问题的问题是,在一个版本的Java中被认为是安全的东西在另一个版本中可能不安全。虽然令人恼火,但最好的办法是总是在谨慎方面犯错,并假设一切都不是线程安全的。问题不仅在于,在两个线程之间更新组件时,您应该得到一个竞争条件,而且重绘管理器会在组件发生变异时尝试重新绘制组件,导致奇怪的绘制效果膨胀,如果我假设一切都不是线程安全的,那么让我们来看看Java 7 update 7(这是最新的一个,不是吗?),将它扩展到我的逻辑,然后我会在EDT中执行它(这是每个人都试图避免的,不是吗?)。如果我们知道Java的版本,有没有办法确定一个方法是否最终会在EDT上执行?唯一合理确定的方法是检查JavaDocs。但是也有一些例子,它们被错误地记录了,所以正如我所说的,最安全的做法是普遍接受您的UI代码必须在EDT的上下文中执行-IMHOunderstand swing和EDT再次继续很好,这是因为您不能接受否定的答案;-)最后一次尝试:有EDT,您必须在该线程上执行与swing view相关的所有操作,始终—只有几个记录在案的异常(重新绘制、重新验证—我不知道还有其他情况)。期间,与它一起生活,没有选择,没有出路。一旦你接受了这个事实(我的意思是真的接受它),生活就会变得更轻松:)另见本文引用的文章。