En los últimos años he desarrollado UI principalmente en Eclipse, que es muy conservador en términos de acceso a subprocesos: cualquier intento de cambiar una propiedad en un widget de UI (por ejemplo, color, texto) desde fuera del subproceso de UI una excepción.¿Qué sucede cuando se viola la política de enhebrado de Swing?
Ahora estoy viendo un programa existente en Swing que tiene una ventana con una gran cantidad de artilugios personalizados. Hay hilos separados que ejecutan una función de mutación para cada uno de estos widgets, y la función de mutación lee el valor de algunas cosas (por ejemplo, colores y valores de las etiquetas) y escribe algunas (por ejemplo, cambia los colores de fondo). Tenga en cuenta que no hay ninguna pintura personalizada involucrada ni nada de eso, solo un montón de cambios en los sub widgets que contiene, que son en su mayoría JLabels.
En la actualidad, esto se ejecuta desde el hilo separado, no desde el hilo de evento Swing. Este hilo repasa todos los 400 widgets y llama al mutador en cada uno. Las actualizaciones parecen funcionar correctamente, pero la GUI no responde a la entrada del usuario.
Si tomo todo, que se ejecuta durante aproximadamente 0,4 mseg desde fuera del hilo Swing y envuelvo cada llamada a un mutador en un invokeLater o invokeAndWait, la interfaz de usuario es mucho más receptiva.
Lo que estoy tratando de entender es:
1) ¿Es legítimo veces para hacer todas estas llamadas desde fuera de la rosca oscilación?
2) ¿Cuál es el impacto en el hilo Swing y por qué la interfaz de usuario responde menos cuando lo llamo desde afuera?