Java 7中的EDT之外的Swing repaint()方法是否仍然安全使用?

前端之家收集整理的这篇文章主要介绍了Java 7中的EDT之外的Swing repaint()方法是否仍然安全使用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道,即使使用Swing的线程模型,它也曾经被认为是安全的从任何线程调用repaint()和其他一些方法,但是最近我在评论中被告知这不是这样.

谷歌发现很多较老的讨论说这是安全的,但最近没有.所有曾经说过安全的官方参考文献似乎已经消失了,我在各种论坛上发现了几个人讨论如何不再安全.

我找不到任何官方确认是否是或者不是 – 我真的很想看到一些解释变化的逻辑如果已经改变的东西.考虑到破坏现有应用程序的风险有多严重,这似乎是一个非常奇怪的功能.

我正在寻找一个官方参考链接(即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

解决方法

这是 official reference

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实现上都能正常运行.

猜你在找的Java相关文章