2011-11-08 12 views
5

quiero interrumpir un hilo, pero invocar interrupción() parece no funciona, a continuación es el código de ejemplo:razón por la interrupción() no funciona como se espera y cómo funciona

public class BasicThreadrRunner { 
    public static void main(String[] args) { 
     Thread t1 = new Thread(new Basic(), "thread1"); 
     t1.start(); 
     Thread t3 = new Thread(new Basic(), "thread3"); 
     Thread t4 = new Thread(new Basic(), "thread4"); 
     t3.start(); 
     t1.interrupt(); 
     t4.start(); 
    } 
} 
class Basic implements Runnable{ 
    public void run(){ 
     while(true) { 
      System.out.println(Thread.currentThread().getName()); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       System.err.println("thread: " + Thread.currentThread().getName()); 
       //e.printStackTrace(); 
      } 
     } 
    } 
} 

pero la salida se parece thead1 todavía está funcionando. Entonces, ¿podría alguien explicarlo, cómo funciona interrupt(), gracias

Respuesta

12

El hilo todavía se está ejecutando simplemente porque usted toma InterruptedException y sigue funcionando. interrupt() establece principalmente un indicador en el objeto Thread, que puede consultar con isInterrupted(). También causa algunos métodos - sleep(), joinObject.wait(), en particular - para devolver inmediatamente arrojando un InterruptedException. También provoca que algunas operaciones de E/S finalicen inmediatamente. Si está viendo las impresiones de su bloque catch, entonces puede ver que interrupt() está funcionando.

+0

: gracias por su ayuda – jason

10

Como han dicho otros, captas la interrupción, pero no haces nada con ella. Lo que hay que hacer es propagar la interrupción usando la lógica tales como,

while(!Thread.currentThread().isInterrupted()){ 
    try{ 
     // do stuff 
    }catch(InterruptedException e){ 
     Thread.currentThread().interrupt(); // propagate interrupt 
    } 
} 

Utilizando la lógica de bucle, como while(true) es sólo codificación perezoso. En su lugar, sondear el indicador interrumpido del hilo para determinar la terminación por interrupción.

+0

O podría mover el try/catch fuera del circuito. ;) –

+2

Sí, pero eso ya fue mencionado por @MByD y mantiene intacta esa lógica de bucle malo. : D – mre

+0

@mre: gracias por su impresora – jason

Cuestiones relacionadas