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?
¿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
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:
javax.swing.text.AbstractDocument:
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()