21 Stimmen

Welche Swing-Komponentenmethoden sind thread-safe?

Laut Swing-Tutorial:

Einige Swing-Komponentenmethoden sind in der API-Spezifikation als "thread-sicher" gekennzeichnet und können daher sicher von jedem Thread aus aufgerufen werden. Alle anderen Swing-Komponentenmethoden müssen vom Ereignis-Dispatch-Thread aufgerufen werden. Programme, die diese Regel ignorieren, funktionieren meistens korrekt, sind jedoch anfällig für unvorhersehbare Fehler, die schwer reproduzierbar sind.

Aber welche sind diese Swing-Komponentenmethoden, die als "thread-sicher" gekennzeichnet sind? Gibt es sie überhaupt?


Aktualisierung / Prämie:

Gibt es eine vollständige Liste von thread-sicheren Swing-Methoden? (Die thread-sicheren Swing-Methoden scheinen recht rar zu sein, daher kann eine solche Liste nicht allzu lang sein...)

20voto

BalusC Punkte 1034465

Google hat mir beigebracht, dass zumindest diese threadsicher sind. Hier ist eine Übersicht für den Fall, dass der Link erneut gebrochen wird:


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





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



7voto

bguiz Punkte 24757

Aber was sind diese Swing-Komponentenmethoden, die als "thread safe" gekennzeichnet sind?

Die meisten Methoden von Swing-Komponenten sind NICHT threadsicher. Aber einige schon. Um herauszufinden, welche das sind, bleibt Ihnen keine andere Wahl, als die Javadocs für die Zielkomponenten zu lesen. Eine sorgfältig erstellte Google-Suche könnte den Prozess beschleunigen.

Gibt es wirklich welche?

Ja, tatsächlich gibt es sie. Allgemein gesprochen, wenn Sie mit Swing-Komponenten arbeiten, ist es wahrscheinlich, dass Sie sowohl threadsichere als auch nicht threadsichere Methoden aufrufen müssen. Da die meisten Methoden nicht threadsicher sind, ziehe ich es vor, auf Nummer sicher zu gehen und alle Aktionen trotzdem threadsicher durchzuführen.

HTH


Nicht erschöpfende Liste.

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) throws BadLocationException
  • public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
  • public Position createPosition(int offs) throws BadLocationException

javax.swing.undo.UndoManager:
Klasse ist threadsicher

5voto

Shawn Vader Punkte 12053

Für eine Liste von Klassen mit dem Kommentar in den Javadocs & src-Dateien "ist threadsicher" ergibt sich folgendes

JEditorPane
JTextArea
AbstractDocument
DefaultCaret
DefaultStyledDocument
JTextComponent    
PlainDocument
StyleContext    
HTMLDocument
UndoManager

Dies bedeutet nicht, dass es andere dokumentierte oder undokumentierte Klassen im Quellcode gibt, die threadsicher sind.

Es erscheint mir als eine ziemlich seltsame Frage, aber ich würde die meisten Komponenten behandeln, nicht threadsicher zu sein. Da Swing ein single-threaded-Modell ist und alle Updates auf dem Event-Dispatcher-Thread erfolgen müssen, ist dies ziemlich einfach zu erreichen.

4voto

oxbow_lakes Punkte 131223

Aber du hast bereits die Antwort: nur diejenigen Methoden, die ausdrücklich dokumentiert sind als thread-sicher im Methoden-JavaDoc, sind threadsicher! das ist von JTextComponent.setText

 * Diese Methode ist threadsicher, obwohl die meisten Swing-Methoden
 * es nicht sind. Bitte beachten Sie 
 * Wie
 * Threads verwendet werden können für weitere Informationen.     

Wenn die Methodendokumentation dies nicht angibt, ist es nicht sicher: Daher ist der Zugriff auf das JavaDoc entscheidend beim Programmieren mit Swing

4voto

trashgod Punkte 199887

In Java 7, wurden einige Methoden der in JTextComponent verwurzelten Ansichtskomponenten fälschlicherweise als threadsicher markiert; sie sind jetzt nicht mehr markiert oder korrekt als nicht threadsicher markiert. Ein typischer Workaround, der EventQueue.invokeLater() verwendet, wird hier gezeigt. Die verbleibenden Modellbezogenen Methoden, aufgelistet hier und unten, sollten aus den in diesem Beitrag dargelegten Gründen kritisch überprüft werden. JTextArea::append ist ein konkretes Beispiel.



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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X