Tim*_*m B 12 java swing multithreading repaint event-dispatch-thread
我知道,repaint()即使使用Swing的线程模型,以前从任何线程调用和其他一些选定的方法都被认为是安全的,但是我最近在评论中告诉我并非如此.
谷歌发现很多旧的讨论说这是安全的,但最近没什么.所有过去曾经说过安全的官方参考文献似乎已经消失了,我在各种论坛上发现了一些人讨论它是如何不再安全的.
我找不到任何正式的东西来确认它是否存在 - 而且我真的希望看到一些解释改变逻辑的东西,如果它已被改变的话.考虑到破坏现有应用程序的风险有多严重,删除它似乎是一个非常奇怪的功能.
我真的在寻找一个官方参考链接(即Javadoc,oracle教程或源代码链接),说明这些方法是否可以安全地从任何线程调用.
这里提到这个问题:
在EDT之外安全使用Component.repaint()?
从现已消失的Sun页面中引用一句话:
以下JComponent方法可以安全地从任何线程调用:repaint(),revalidate()和invalidate().repaint()和revalidate()方法将事件派发线程的请求分别调用paint()和validate().
这符合我的理解,但我现在找不到那个页面或任何类似的页面,我看到几个人的未经证实的谣言说它不再安全.但另一方面,我找不到任何明确的说这个功能已经改变.
改变笔记
可能有助于解决这个问题的是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的线程策略
一般来说,Swing不是线程安全的.除非另有说明,否则必须在事件派发线程上访问所有Swing组件和相关类.
并且该repaint方法不"以其他方式记录".
为了再次向您保证,您不需要查看单个方法的Javadoc以获得明确的答案,例如,请参阅Java 6 Javadoc中如何记录方法的线程安全性.
显然,需要对规范性规范,描述性技术文章和任何具体实现的细节之间的区别进行更多澄清.Javadoc所说的是:无法保证repaint是一种线程安全的方法.顺便提一下,Java 7中经常讨论的从大多数Swing API中删除"线程安全"标识的决定就是:合同的变更,而不是实现.
repaintOpenJDK 7中的具体实现似乎是线程安全的,这与规范给出的保证无关.依赖于线程安全性repaint或其他方法的代码被破坏,并且不能保证在所有Java实现上都能正常运行.
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |