我知道,即使使用Swing的线程模型,它也曾经被认为是安全的从任何线程调用repaint()和其他一些方法,但是最近我在评论中被告知这不是这样.
谷歌发现很多较老的讨论说这是安全的,但最近没有.所有曾经说过安全的官方参考文献似乎已经消失了,我在各种论坛上发现了几个人讨论如何不再安全.
我找不到任何官方确认是否是或者不是 – 我真的很想看到一些解释变化的逻辑如果已经改变的东西.考虑到破坏现有应用程序的风险有多严重,这似乎是一个非常奇怪的功能.
我正在寻找一个官方参考链接(即Javadoc,oracle教程或源代码链接),指出这些方法是否仍然可以从任何线程调用.
参考这个问题在这里:
从现在消失的太阳页面引用一句话:
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: