2010-03-19 10 views
12

Entiendo lo que hace una InterruptedException y por qué se lanza. Sin embargo, en mi aplicación lo obtengo cuando espero SwingUtilities.invokeAndWait() en un hilo que solo conozco en mi aplicación, y mi aplicación nunca llama al Thread.interrupt() en ningún hilo, y tampoco pasa la referencia del hilo a nadie.¿Quién interrumpe mi hilo?

Así que mi pregunta es: ¿Quién interrumpe mi hilo?

¿Hay alguna manera de saberlo? ¿Hay alguna razón por la cual InterruptedException no contiene el nombre del hilo que solicita la interrupción?

leí que podría tratarse de un marco o una biblioteca que hace esto, se utiliza el siguiente, pero no puedo pensar en razón para que interrumpen mi hilo:

  • Hibernate
  • primavera
  • Log4J
  • conector
  • Mysql
+8

Creo que quieres decir "¿Quién * ATREVE * interrumpe mi hilo?" –

+2

+1 - ¿Estás haciendo un Thread # join? arroja InterruptedException. – RubyDubee

+0

De hecho Scott, preferiría que mis hilos no fueran interrumpibles (porque de todos modos no quiero cumplir con la solicitud). No hacemos el hilo # únete a nosotros, pero podría imaginar que invokeAndWait utiliza dicho mecanismo. Sin embargo, ¿se uniría Thead # invoca una interrupción en otro hilo? También estoy bastante seguro de que nadie espera a que mi hilo se complete (como nunca lo hará). – Thirler

Respuesta

11

Si es posible, se podría extender Thread y sobrescribir el método interrupt() para este hilo para imprimir un StackTrace o lanzar una excepción operación no compatible.

También puede usar la clase extendida Thread para almacenar una referencia al hilo de interrupción y leerlo una vez que capte la excepción interrumpida.

2

Hay algo extraño aquí.

Desde el javadoc de invokeAndWait, un InterruptedException se lanza

si estamos interrumpido mientras se espera para el despacho de eventos hilo para terminar excecuting doRun.run()

¿Ha intentado ver si el código ejecutado en el EDT envía alguna excepción? O el código en ese EDT intenta modificar algunas de las variables de este subproceso (sé que este término no es "ortodoxo" en lenguaje Java, pero espero que vea lo que quiero decir: cualquier código que implique sincronizar, esperar, unir, ...

+0

Si el Runnable que estamos esperando arroja una excepción, debería dar una InvocationTargetException, que no es el caso. Es posible que nuestros hilos tengan un bloqueo mientras esperan, ¿podría eso causarlo? Estoy seguro de que no tenemos un punto muerto. El hilo que esperamos crea un diálogo que usamos en el hilo de espera. – Thirler

4

En general, si quieres saber quién está haciendo algo, adjuntar un depurador, poner un punto de interrupción, y hay que ir. No hay necesidad de adivinar si se puede reproducirlo!

En este caso, se puede ponga un punto de interrupción en Thread.interrupt(). Si hay otros hilos que también se están interrumpiendo (por lo que tiene hits "falsos positivos" en el punto de interrupción), puede agregar una condición de punto de interrupción (la mayoría de los IDE le permiten hacerlo fácilmente), por ejemplo mediante comprobar el nombre del hilo

Cuestiones relacionadas