2011-12-25 10 views
8

Estoy tratando de interrumpir el hilo en el siguiente código:interrupción() no funciona

public synchronized void run() { 
    try { 
     while (!Thread.currentThread().isInterrupted()) { 
      this.scan(); 
      this.distribute(); 
      this.wait(); 
     } 
    } catch (InterruptedException e) {} 
} 

public void cancel() { 
    this.interrupt(); 
} 

Pero el hilo no se terminará. Usé el depurador y descubrí que después del comando this.interrupt(), el hilo no se interrumpe (puse un reloj en la expresión this.isInterrupted() y se queda false). ¿Alguien tiene una idea de por qué este hilo no será interrumpido?

Editar:

El problema ha sido encontrado. Resulta que hubo dos instancias de este hilo. Te adjunto el código problemático que conducen a esto:

/* (class Detector extends Thread) */ 
Detector detector = new Detector(board); 
... 
Thread tdetector = new Thread(detector); /* WRONG!!! */ 
... 
tdetector.start(); 
... 
+0

¿Qué pasa si lo intentas con '! Thread.interrupted()' en la condición –

+0

No hay static método en la clase 'Thread' con ese nombre. Y no tendría sentido, porque este es un método que está relacionado con una instancia de esta clase. –

+0

Ciertamente hay un método estático ['Thread.interrupted()'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#interrupted%28%29). No creo que ayude, sin embargo, porque básicamente hace lo mismo que el método de instancia (pero también borra la bandera interrumpida, lo que puede complicar las cosas). –

Respuesta

5

Según the docs, si se llama a interrupt() mientras que el hilo está en un estado wait(), no se establecerá la bandera de interrupción. Debería recibir una excepción interrumpida, que saldrá del bucle (y del hilo).

EDITAR

por mi comentario y su respuesta, el problema es que usted tiene más de uno de estos subprocesos que se ejecutan.

+0

Pero el hilo no termina. El programa completo no termina debido a este hilo. –

+1

@LeifEricson - ¿Está el hilo atrapado en algún ciclo de cálculo dentro de 'scan()' o 'distribute()'? –

+0

No. Utilicé el depurador para confirmar que nunca se queda atascado dentro de estos métodos. –

2

Probablemente esté llamando al cancel en el hilo equivocado. Si lo miras, es cancel() cancela este hilo. Probablemente quieras cancelar otro hilo.

También es cierto que su llamada a isInterrupted() es innecesaria, pero eso no hará que las interrupciones se perdieron ...


Por otro lado, si el método cancel es un método de una clase que se extiende Thread, entonces el this podría ser el hilo que debe cancelarse. (El problema para nosotros, la gente que intenta responder es que hay/no hubo detalles suficientes en la pregunta original ...)

+0

'cancel' parece ser un método de instancia, por lo que se invoca' interrupt' al objeto Thread correcto. El método ciertamente no tiene que ser invocado mientras se ejecuta en ese hilo (lo que haría el método inútil). La llamada a 'isInterrupted()' es necesaria si la llamada a 'interrupt()' ocurre mientras el hilo está realmente computando (en cuyo caso no se lanza InterruptedException). –

+1

No. Quiero terminar este hilo. Otro hilo llama al método 'cancelar'. Esta es la única manera que conozco para terminar un hilo que tiene métodos de bloqueo (como 'wait()') –

+0

Pero cuando 'Otro' hilo llama cancelar, se cancela a sí mismo, no a ti. Necesitas encontrar una forma de almacenar ** tu ** hilo para cancelar. Probablemente en su método 'run', almacene su' Thread.getCurrentThread() 'y luego en su' cancel' interrupt ** that ** thread. – OldCurmudgeon

Cuestiones relacionadas