一些Swing组件方法在API规范中标记为“线程安全”;这些可以从任何线程安全地调用。必须从事件派发线程调用所有其他Swing组件方法。忽略此规则的程序可能在大多数情况下正常运行,但会遇到难以重现的不可预测的错误。
但是这些标记为“线程安全”的Swing组件方法是什么?实际上有吗?
是否有完整列表的线程安全摆动方法? (线程安全的Swing方法似乎很少见,所以这样的列表不能太长......)
答案 0 :(得分:18)
Google告诉我,至少those是线程安全的。以下是链接再次破坏的情况概述:
JTextPane
replaceSelection()
insertComponent()
insertIcon()
setLogicalStyle()
setCharacterAttributes()
setParagraphAttributes()
JTextArea
insert()
append()
replaceRange()
JTextComponent
replaceSelection()
setText()
print()
getPrintable()
UndoManager
DefaultStyledDocument
insert()
setLogicalStyle()
setCharacterAttributes()
setParagraphAttributes()
StyleContext
addAttribute()
addAttributes()
removeAttribute()
removeAttributes()
reclaim()
AbstractDocument
render()
remove()
insertString()
createPosition()
PlainDocument
insertString()
HTMLDocument
setParagraphAttributes()
答案 1 :(得分:7)
但是这些标记为“线程安全”的Swing组件方法是什么?
大多数Swing组件的方法都不是线程安全的。但有些人是。要找出哪些,你别无选择,只能仔细阅读目标组件的javadoc。 A carefully constructed google search可能会加快这一过程。
实际上有吗?
是的确有。一般来说,如果您正在使用Swing组件,则可能需要调用线程安全和非线程安全的方法。由于大多数方法都是非线程安全的,因此我更倾向于谨慎行事,并以线程安全的方式对它们执行所有操作。
HTH
不详尽的清单。
DefaultStyledDocument:
javax.swing.text.AbstractDocument中:
javax.swing.undo.UndoManager中:
类是线程安全的
答案 2 :(得分:5)
有关javadocs&中带注释的类列表src文件“是线程安全的” 返回以下
JEditorPane
JTextArea
AbstractDocument
DefaultCaret
DefaultStyledDocument
JTextComponent
PlainDocument
StyleContext
HTMLDocument
UndoManager
这并不是说在src中有其他记录或未记录的线程安全的。
这对我来说是一个相当奇怪的问题,但我会将大多数组件视为不是线程安全的,因为Swing是一个单线程模型,并且所有更新都需要在事件调度程序线程上进行,这很漂亮容易做到。
答案 3 :(得分:4)
但是您已经得到了答案:只有那些具体记录的方法在JavaDoc 方法中是线程安全的,是线程安全的!这是JTextComponent.setText
* This method is thread safe, although most Swing methods * are not. Please see * <A HREF="http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html">How * to Use Threads</A> for more information.
如果方法文档没有说它是安全的,那么它就不安全了:因此在对Swing进行编码时访问JavaDoc是至关重要的
答案 4 :(得分:4)
在Java 7中,以JTextComponent
为根的视图组件的先前线程安全方法不再是线程安全的。使用EventQueue.invokeLater()
的典型解决方法显示为here。列出here的其余与模型相关的方法仍然是线程安全的。
JTextComponent
replaceSelection()
setText()
print()
getPrintable()
JTextPane
replaceSelection()
insertComponent()
insertIcon()
setLogicalStyle()
setCharacterAttributes()
setParagraphAttributes()
JTextArea
insert()
append()
replaceRange()