java - interfaz - ¿Es seguro construir widgets Swing/AWT que NO estén en el hilo de distribución de eventos?
que es awt y swing en java (2)
He estado integrando el aspecto y la sensación de Substance en mi aplicación y encontré varios problemas con respecto a las rutinas de comprobación de EDT (subproceso de envío de eventos) internas. La sustancia se niega por completo a construir clases de IU fuera del EDT. He hecho bastantes Swing / AWT y conozco la mayoría de las reglas con respecto al EDT. Utilizo SwingWorker, SwingUtilties.invokeLater para modificar componentes. Siempre pensé que los componentes se podrían CONSTRUIR fuera del EDT, pero se deben realizar y manipular en el EDT. En otras palabras, puede construir y configurar valores predeterminados en segundo plano, pero la llamada a pack / setVisible debe ser EDT, así como cualquier llamada posterior para manipular el componente.
La razón por la que pregunto es que tengo una ventana particularmente robusta para construir, que implica muchos widgets, estado y recursos (muchos iconos). Previamente, construí la ventana en el método de fondo de un SwingWorker e hice la ventana visible en el método done. Nunca tuve ningún problema. Al cambiar a Sustancia, la comprobación interna de EDT me muerde.
He podido refactorizar el código para evitar esto. Puedo construir en el EDT, que no es una buena solución ya que toda la aplicación se bloqueará. También puedo refactorizar aún más y hacer todo lo posible para cargar todos los recursos adicionales fuera del EDT.
Envolviéndolo ... ¿Es seguro construir widgets Swing / AWT NO en el hilo de distribución de eventos?
No.
La razón simple es que incluso al EDT le gusta el punto muerto en algunos casos raros y, en general, es fácil bloquear la interfaz de usuario cuando se usa Swing ( o eso me han dicho ). Le sugiero que lea estos tres artículos del blog de Kirill (el desarrollador de sustancias):
Sun cambió las reglas en 2004; antes, se le permitía crear los componentes fuera del EDT y solo tenía que moverse al EDT una vez que se había realizado el componente.
La nueva regla ahora dice:
Para evitar la posibilidad de un punto muerto, debe tener extremo cuidado de que los componentes y modelos Swing se creen , modifiquen y consulten solo desde el hilo de envío de eventos.
this publicación de blog mía brinda más detalles, incluidos enlaces a otros artículos relacionados. tenga en cuenta que todos los examples oficiales de Sun han sido reescritos y son muy estrictos al respecto.
Históricamente, probablemente fue la creciente disponibilidad de computadoras multinúcleo como máquinas de escritorio lo que motivó la reformulación de la regla: los problemas de enhebrado se hicieron cada vez más evidentes en la pila de clientes, y al ser muy estrictos con las pautas de EDT, mucho de ellos puede prevenirse desde el principio.