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

Согласно учебнику по Swing:

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

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


Обновление / награда:

Есть ли полный список поточно-ориентированных методов качания? (Потоко-безопасные методы Swing кажутся довольно редкими, поэтому такой список не может быть слишком длинным ...)


person Joonas Pulakka    schedule 25.11.2009    source источник
comment
Вопрос подсказывает мне, что вы пытаетесь манипулировать графическим интерфейсом Swing из более чем одного потока? Если это так, вы можете переосмыслить свой дизайн, поскольку всегда должна быть возможность гарантировать, что все взаимодействия Swing происходят только из одного потока, если вы правильно обрабатываете разгрузку работы в другие потоки, например. с некоторой формой очереди на работу. Если вы сделаете это, вам не нужно будет беспокоиться о безопасности потоков Swing ....   -  person mikera    schedule 18.10.2010


Ответы (5)


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


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





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



person BalusC    schedule 25.11.2009
comment
Пожалуйста. В любом случае вот полезная ссылка: googleguide.com/using_advanced_operators.html - person BalusC; 25.11.2009
comment
@Gili: Я исправил ссылку. Просто замените старый java.sun.com URL-адресом примерно полугодовой давности download.oracle.com. Вместо того, чтобы голосовать против, вы также можете просто отредактировать ответ. Плохая ссылка была совершенно непреднамеренной. - person BalusC; 03.01.2011
comment
О, setText является потокобезопасным в материалах JTextComponent. Это интересно :) Означает, что во многих случаях мне больше не нужно использовать EDT. Интересно, однако, если вы используете неофициальный LAF, останется ли он потокобезопасным? - person Chris Dennett; 03.01.2011
comment
Часть информации устарела. JTextArea.append больше не является потокобезопасным в java 7. - person Jarekczek; 08.10.2012
comment
@Jarekczek: Я добавил обновление для Java 7 здесь. - person trashgod; 12.04.2013

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

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

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

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

HTH


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

DefaultStyledDocument:

  • protected void insert (int offset, DefaultStyledDocument.ElementSpec [] data) выдает исключение BadLocationException
  • public void setLogicalStyle (int pos, Style s)
  • public void setCharacterAttributes (смещение int, длина int, AttributeSet s, логическая замена)
  • public void setParagraphAttributes (смещение int, длина int, AttributeSet s, логическая замена)

javax.swing.text.AbstractDocument:

  • публичный void render (Runnable r)
  • public void remove (int offs, int len) выдает исключение BadLocationException
  • public void insertString (int offs, String str, AttributeSet a) выдает исключение BadLocationException
  • public Position createPosition (int offs) выбрасывает BadLocationException

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

person bguiz    schedule 25.11.2009
comment
@BalusC Не сделал! Учтите, что прежде чем делать какие-то выводы, нужно несколько минут, чтобы набрать ответ. - person bguiz; 26.11.2009
comment
Wew. Всем приятно! это отличная информация для меня. с тех пор я пытаюсь работать в SWING. : D - person gumuruh; 20.04.2012

Для списка классов с комментарием в файлах javadocs и src "is thread safe" возвращает следующее

JEditorPane
JTextArea
AbstractDocument
DefaultCaret
DefaultStyledDocument
JTextComponent    
PlainDocument
StyleContext    
HTMLDocument
UndoManager

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

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

person Shawn Vader    schedule 18.10.2010

Но у вас уже есть ответ: только те методы, которые специально задокументированы как потокобезопасные в методе 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.

person oxbow_lakes    schedule 25.11.2009
comment
Да, это неявный ответ, но это все еще не список поточно-безопасных методов. - person Joonas Pulakka; 25.11.2009
comment
Вы спросили, есть ли какие-нибудь, и я привел пример. Гм. - person oxbow_lakes; 25.11.2009
comment
Существуют также методы, которые не документированы как потокобезопасные, но которые можно вызывать из других потоков. По крайней мере, я так думаю. Например. метод dispose() в классе java.awt.Window может быть вызван любым потоком, потому что сам метод создает исполняемый файл, который отправляется в EDT. Конечно, вы можете возразить, что dispose() - это метод AWT, а не метод Swing, но он достаточно часто используется в Swing, чтобы его стоит упомянуть. - person Alderath; 03.04.2012

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



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

person trashgod    schedule 12.04.2013
comment
хм ... почему? Просто взглянул на методы JTextComponent, первые два не гарантируют потокобезопасность, а методы, связанные с печатью, блокируют вызывающий поток. Afair (не перепроверял), в настоящее время нет ничего поточно-ориентированного, кроме перерисовки и повторной проверки (что гарантирует отправку запроса в EDT при необходимости) - person kleopatra; 13.04.2013
comment
ох ... может я неправильно понял ваше намерение: это что-то вроде старого списка без перечисленных здесь методов? Если так, то было бы менее запутанно (по крайней мере, для меня :) перечислить методы, которые все еще документированы как потокобезопасные. - person kleopatra; 13.04.2013
comment
@kleopatra: Не могу не согласиться - это сбивает с толку! Я искал общую тему (без каламбура :-), и, похоже, это затронуло компоненты представления. Вместо того, чтобы упреждать исходный ответ, я решил сосредоточиться на списке потенциальных проблем с восходящей миграцией как на тех, которые нуждаются в проверке. . - person trashgod; 13.04.2013