Java 哪些Swing组件方法是线程安全的?

Java 哪些Swing组件方法是线程安全的?,java,swing,thread-safety,Java,Swing,Thread Safety,根据: 一些Swing组件方法在API规范中被标记为“线程安全”;这些可以从任何线程安全地调用。必须从事件分派线程调用所有其他Swing组件方法。忽略此规则的程序可能在大多数情况下都能正常运行,但会出现难以重现的不可预测错误 但是这些被标记为“线程安全”的Swing组件方法是什么呢?真的有吗 更新/悬赏: 是否有线程安全的swing方法的完整列表?(线程安全的Swing方法似乎很少见,所以这样的列表不能太长……谷歌告诉我,至少线程是安全的。下面是链接再次断开的情况的概述: replac

根据:

一些Swing组件方法在API规范中被标记为“线程安全”;这些可以从任何线程安全地调用。必须从事件分派线程调用所有其他Swing组件方法。忽略此规则的程序可能在大多数情况下都能正常运行,但会出现难以重现的不可预测错误

但是这些被标记为“线程安全”的Swing组件方法是什么呢?真的有吗


更新/悬赏:
是否有线程安全的swing方法的完整列表?(线程安全的Swing方法似乎很少见,所以这样的列表不能太长……

谷歌告诉我,至少线程是安全的。下面是链接再次断开的情况的概述:


    • replaceSelection()
    • insertComponent()
    • insertIcon()
    • setLogicalStyle()
    • setCharacterAttributes()
    • setParagraphAttributes()

    • insert()
    • append()
    • replaceRange()

    • replaceSelection()
    • setText()
    • print()
    • getPrintable()

    • 所有方法

    • insert()
    • setLogicalStyle()
    • setCharacterAttributes()
    • setParagraphAttributes()

    • addAttribute()
    • addAttributes()
    • removeAttribute()
    • removeAttributes()
    • 回收()

    • render()
    • remove()
    • insertString()
    • createPosition()

    • insertString()

    • setParagraphAttributes()

但是您已经得到了答案:只有那些在方法JavaDoc中明确记录为线程安全的方法才是线程安全的!这是来自
JTextComponent.setText

*此方法是线程安全的,尽管大多数Swing方法
*不是。请看
*了解更多信息。
如果方法文档没有说它是安全的,那么它就是不安全的:因此,在针对Swing进行编码时,访问JavaDoc是至关重要的

但是这些被标记为“线程安全”的Swing组件方法是什么呢

大多数Swing组件的方法都不是线程安全的。但有些是。要找出是哪一个,您别无选择,只能仔细阅读目标组件的javadocs。可能会加快这一进程

真的有吗

是的,确实有。一般来说,如果您使用的是Swing组件,那么很可能需要同时调用线程安全和非线程安全方法。由于大多数方法都是非线程安全的,所以我宁愿谨慎行事,并以线程安全的方式对它们执行所有操作


并非详尽无遗的清单

DefaultStyledDocument:

  • 受保护的void insert(int offset,DefaultStyledDocument.ElementSpec[]数据)引发BadLocationException
  • 公共void setLogicalStyle(内部位置,样式s)
  • 公共void setCharacterAttributes(整数偏移量、整数长度、属性集s、布尔替换)
  • 公共void集合段落属性(整数偏移量、整数长度、属性集s、布尔替换)
javax.swing.text.AbstractDocument:

  • 公共无效渲染(可运行r)
  • public void remove(int offs,int len)引发BadLocationException
  • public void insertString(int offs、String str、AttributeSet a)引发BadLocationException
  • 公共位置createPosition(int offs)引发BadLocationException
javax.swing.undo.UndoManager:

类是线程安全的

查看javadocs&src文件中带有注释的类列表“是线程安全的” 返回以下内容

JEditorPane
JTextArea
AbstractDocument
DefaultCaret
DefaultStyledDocument
JTextComponent    
PlainDocument
StyleContext    
HTMLDocument
UndoManager
这并不是说src中还有其他线程安全的文档或未文档

我觉得这是一个相当奇怪的问题,但我认为大多数组件都是线程安全的而不是,因为Swing是单线程模型,所有更新都需要在事件调度器线程上进行,所以这很容易做到

在中,以前基于
JTextComponent
的视图组件的线程安全方法不再是线程安全的。下面显示了使用
EventQueue.invokeLater()
的典型解决方法。列出的其余与模型相关的方法仍然是线程安全的


    • replaceSelection()
    • setText()
    • print()
    • getPrintable()

    • replaceSelection()
    • insertComponent()
    • insertIcon()
    • setLogicalStyle()
    • setCharacterAttributes()
    • setParagraphAttributes()

    • insert()
    • append()
    • replaceRange()

是的,这是一个隐含的答案,但它仍然不是线程安全方法的列表。你问“有没有”我提供了一个例子。还有一些方法没有被证明是线程安全的,但是可以从其他线程调用。至少我是这么想的。例如,java.awt.Window类中的
dispose()
方法可以由任何线程调用,b
JEditorPane
JTextArea
AbstractDocument
DefaultCaret
DefaultStyledDocument
JTextComponent    
PlainDocument
StyleContext    
HTMLDocument
UndoManager