谷歌发现很多较老的讨论说这是安全的,但最近没有.所有曾经说过安全的官方参考文献似乎已经消失了,我在各种论坛上发现了几个人讨论如何不再安全.
我找不到任何官方确认是否是或者不是 – 我真的很想看到一些解释变化的逻辑如果已经改变的东西.考虑到破坏现有应用程序的风险有多严重,这似乎是一个非常奇怪的功能.
我正在寻找一个官方参考链接(即Javadoc,oracle教程或源代码链接),指出这些方法是否仍然可以从任何线程调用.
参考这个问题在这里:
Safe to use Component.repaint() outside EDT?
从现在消失的太阳页面引用一句话:
The following JComponent methods are safe to call from any thread: repaint(),revalidate(),and invalidate(). The repaint() and revalidate() methods queue requests for the event-dispatching thread to call paint() and validate(),respectively.
这符合我的理解,但我现在找不到该页面或任何类似的页面,并且我看到几个人的未经证实的谣言说它已经不再安全了.但另一方面,我没有任何明确的说法,这个功能已经改变了.
更改备注
什么可以帮助解决这个问题是Oracle关于Swing线程处理变化的官方声明.我发现“Java 7的变化”页面,但是根本没有提到它,这些页面都没有以任何方式提到线程或EDT:
http://docs.oracle.com/javase/7/docs/technotes/guides/swing/enhancements-7.html
http://docs.oracle.com/javase/7/docs/technotes/guides/awt/enhancements-7.html
解决方法
Swing’s Threading Policy
In general Swing is not thread safe. All Swing components and related classes,unless otherwise documented,must be accessed on the event dispatching thread.
并且重绘方法没有“另有说明”.
为了再次向您保证,您不需要比单个方法的Javadoc进一步了解最终答案,请参见例如Java 6 Javadoc中记录方法的线程安全性.
更新
显然,需要对规范性规范,描述性技术文章和具体实施细节之间的区别作更多的澄清. Javadoc所说的是这样的:不能保证重绘是一个线程安全的方法.顺便提一句,Java 7中经常讨论的大多数Swing API中删除“线程安全”指定的决定只是:合同的变更,而不是实现.
OpenJDK 7中的重绘的具体实现似乎是线程安全的,这与规范给出的保证无关.依赖线程安全的代码或其他方法的代码被破坏,并且不能保证在所有Java实现上都能正常运行.