¿Qué métodos de componente Swing son seguros para subprocesos?

De acuerdo con el tutorial de Swing :

Algunos métodos del componente Swing están etiquetados como “hilo seguro” en la especificación API; estos pueden invocarse de forma segura desde cualquier hilo. Todos los demás métodos del componente Swing se deben invocar desde el hilo de envío del evento. Los progtwigs que ignoran esta regla pueden funcionar correctamente la mayor parte del tiempo, pero están sujetos a errores impredecibles que son difíciles de reproducir.

Pero, ¿qué son estos métodos del componente Swing etiquetados como “hilo seguro”? ¿Hay realmente alguno?


Actualización / recompensa:

¿Hay una lista completa de métodos de swing seguro de subprocesos? (Los métodos Swing seguros para subprocesos parecen ser bastante raros, por lo que dicha lista no puede ser demasiado larga …)

Google me enseñó que, al menos, estos son enhebrables. Aquí hay una descripción general para el caso en que el enlace se rompe de nuevo:


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

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

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

  • UndoManager
    • Todos los metodos

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

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

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

  • PlainDocument
    • insertString()

  • HTMLDocument
    • setParagraphAttributes()

Pero, ¿qué son estos métodos del componente Swing etiquetados como “hilo seguro”?

La mayoría de los métodos de los componentes Swing NO son seguros para subprocesos. Pero algunos lo son Para saber cuáles, no tiene más opción que examinar detenidamente los javadocs para sus componentes de destino. Una búsqueda de Google cuidadosamente construida podría acelerar el proceso.

¿Hay realmente alguno?

Sí, de hecho hay. En términos generales, si está trabajando con componentes Swing, es probable que tenga que invocar métodos seguros tanto para subprocesos como para subprocesos. Como la mayoría de los métodos no son seguros para subprocesos, prefiero equivocarme por el lado de la precaución y realizar todas las acciones en ellos de una manera segura para subprocesos.

HTH


Lista no exhaustiva.

DefaultStyledDocument:

  • la inserción de vacíos protegidos (int offset, DefaultStyledDocument.ElementSpec [] data) arroja 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) arroja BadLocationException
  • public void insertString (int offs, String str, AttributeSet a) lanza BadLocationException
  • public Position createPosition (int offs) arroja BadLocationException

javax.swing.undo.UndoManager:
La clase es segura

Para obtener una lista de las clases con el comentario en los archivos javadocs & src “is thread safe” devuelve el siguiente

 JEditorPane JTextArea AbstractDocument DefaultCaret DefaultStyledDocument JTextComponent PlainDocument StyleContext HTMLDocument UndoManager 

Esto no significa que haya otros documentados o no documentados dentro del src que sean seguros para la ejecución de subprocesos.

Me parece una pregunta bastante extraña, pero consideraría que la mayoría de los componentes no son enhebrables y, dado que Swing es un modelo de subproceso único y todas las actualizaciones deben realizarse en el subproceso de despachador de eventos, esto es bastante fácil de hacer.

Pero ya tiene la respuesta: ¡ solo aquellos métodos que están específicamente documentados como seguros para subprocesos en el método JavaDoc , son seguros para la ejecución de hilos! esto es de JTextComponent.setText

  * This method is thread safe, although most Swing methods * are not. Please see * How * to Use Threads for more information. 

Si la documentación del método no dice que es seguro, entonces no es seguro: el acceso al JavaDoc es, por lo tanto, crítico al codificar contra Swing.

En Java 7 , los métodos previamente seguros para subprocesos de los componentes de vista enraizados en JTextComponent ya no son seguros para subprocesos. EventQueue.invokeLater() se muestra una solución típica usando EventQueue.invokeLater() . Los métodos restantes relacionados con el modelo, enumerados aquí , permanecen seguros para subprocesos.


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

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

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