Подтвердить что ты не робот

Какие методы компонента Swing являются потокобезопасными?

В соответствии с Учебник по Swing:

Некоторые методы компонента Swing помечены как "потокобезопасные" в спецификации API; они могут быть безопасно вызваны из любого потока. Все остальные методы компонента Swing должны быть вызваны из потока отправки событий. Программы, которые игнорируют это правило, могут нормально функционировать большую часть времени, но подвержены непредсказуемым ошибкам, которые трудно воспроизвести.

Но каковы эти методы компонента Swing, помеченные как "потокобезопасные"? Есть ли вообще?


Обновление/баунти:

Существует ли полный список методов, оптимизирующих потоки? (Методы Swing, безопасные для потоков, кажется довольно редкими, поэтому такой список не может быть слишком длинным...)

4b9b3361

Ответ 1

Google научил меня, что по крайней мере те являются потокобезопасными. Вот обзор для случая, когда ссылка снова сломается:


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





  • StyleContext
    • addAttribute()
    • addAttributes()
    • removeAttribute()
    • removeAttributes()
    • reclaim()



Ответ 2

Но каковы эти методы компонента Swing, помеченные как "потокобезопасные"?

Большинство методов компонентов Swing не являются потокобезопасными. Но некоторые из них. Чтобы узнать, какие из них, у вас нет выбора, кроме как просмотреть javadocs для ваших целевых компонентов. Тщательно построенный поиск google может ускорить процесс.

Есть ли вообще какие-либо?

Да, действительно. Вообще говоря, если вы работаете с компонентами Swing, вполне вероятно, что вам придется использовать как поточно-безопасные, так и не потоковые методы. Поскольку большинство методов не являются потокобезопасными, я предпочитаю ошибаться с осторожностью и выполнять все действия над ними в потокобезопасной манере.

НТН


Не исчерпывающий список.

DefaultStyledDocument:

  • protected void insert (int offset, DefaultStyledDocument.ElementSpec [] data) throws BadLocationException
  • public void setLogicalStyle (int pos, Style s)
  • public void setCharacterAttributes (int offset, int length, AttributeSet s, boolean replace)
  • public void setParagraphAttributes (int offset, int length, AttributeSet s, boolean replace)

javax.swing.text.AbstractDocument:

  • public void render (Runnable r)
  • public void remove (int offs, int len) бросает BadLocationException
  • public void insertString (int offs, String str, AttributeSet a) выбрасывает исключение BadLocationException
  • public Позиция createPosition (int offs) выбрасывает исключение BadLocationException

javax.swing.undo.UndoManager:
Класс является потокобезопасным

Ответ 3

Список классов с комментарием в файлах javadocs и src "является потокобезопасным" возвращает следующие

JEditorPane
JTextArea
AbstractDocument
DefaultCaret
DefaultStyledDocument
JTextComponent    
PlainDocument
StyleContext    
HTMLDocument
UndoManager

Это не говорит о том, что в src есть другие документированные или недокументированные файлы, которые являются потокобезопасными.

Мне кажется, что это довольно странный вопрос, но я бы рассматривал большинство компонентов как не, которые являются потокобезопасными, и поскольку Swing - это однопоточная модель, и все обновления должны произойти в потоке диспетчера событий, это довольно легко сделать.

Ответ 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.     

Если в документации по методу не сказано, что это безопасно, тогда это небезопасно: поэтому доступ к JavaDoc имеет решающее значение при кодировании с Swing

Ответ 5

В Java 7, ранее потокобезопасные методы компонентов вида, внедренных в JTextComponent, уже не являются потокобезопасными. Типичное обходное решение с использованием EventQueue.invokeLater() показано здесь . Оставшиеся связанные с моделью методы, перечисленные здесь, остаются потокобезопасными.



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