Mi estrategia para problemas de threads en una aplicación Java Swing es dividir métodos en tres tipos:Java: las pruebas de acceso de hilo con los métodos "no seguro para subprocesos"
- métodos que deben ser accedidos por el hilo de interfaz gráfica de usuario. Estos métodos nunca deben bloquear y pueden llamar a los métodos de oscilación. No es seguro para subprocesos
- métodos a los que se debe acceder mediante subprocesos que no sean de GUI. Básicamente, esto se aplica a todas las operaciones de bloqueo (potencialmente), como el disco, la base de datos y el acceso a la red. Nunca deberían llamar a los métodos de swing. No es seguro para subprocesos
- métodos a los que pueden acceder ambos. Estos métodos tienen que ser seguros para subprocesos (por ejemplo, sincronizados)
Creo que este es un enfoque válido para aplicaciones de GUI, donde normalmente solo hay dos subprocesos. Recortar el problema realmente ayuda a reducir el "área de superficie" para las condiciones de carrera. La advertencia, por supuesto, es que nunca accidentalmente llamas un método del hilo equivocado.
Mi pregunta es acerca de las pruebas:
¿Hay herramientas de pruebas que pueden ayudar a que compruebe que un método es llamado desde el hilo correcto? Sé de SwingUtilities.isEventDispatchThread()
, pero realmente estoy buscando algo usando anotaciones Java o programación orientada a aspectos para no tener que insertar el mismo código repetitivo en todos y cada uno de los métodos del programa.
+1 para la pregunta creativa – KLE
sincronizado no es igual a thread safe. Te sugiero que leas las 'nuevas' librerías de concurrencia en Java 5, especialmente los futuros parecen ser útiles para el desarrollo de Swing, creo. –
@Jens: tienes razón, he editado la pregunta ligeramente. – amarillion