2011-11-08 7 views
5

Chcę przerwać wątek, ale wywołać przerwanie() nie wydaje się działać, poniżej jest przykładowy kod:dlaczego przerwania() nie działa zgodnie z oczekiwaniami i jak to działa

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(); 
      } 
     } 
    } 
} 

ale wyjście wygląda thead1 nadal działa. Każdy może wyjaśnić, jak działa interrupt(), dzięki

Odpowiedz

12

Wątek nadal działa, ponieważ złapałeś InterruptedException i nadal działa. interrupt() przede wszystkim ustawia flagę w obiekcie Thread, którą można sprawdzić za pomocą isInterrupted(). Powoduje to również niektóre metody - w szczególności: - natychmiastowe zwrócenie przez wyrzucenie InterruptedException. Powoduje również, że niektóre operacje wejścia/wyjścia natychmiast kończą działanie. Jeśli widzisz wydruki z bloku catch, możesz zobaczyć, że działa interrupt().

+0

: dzięki za pomoc – jason

10

Jak powiedzieli inni, łapiesz przerwanie, ale nic z tym nie robisz. Co trzeba zrobić, to propagować przerwania za pomocą logiki, takie jak

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

Stosując logikę pętli, takich jak while(true) jest po prostu leniwy kodowania. Zamiast tego sonduj przerwaną flagę wątku, aby ustalić przerwanie połączenia.

+0

Lub możesz przenieść próbę/catch poza pętlę. ;) –

+2

Tak, ale było to już wspomniane przez @MByD i utrzymuje tę niepoprawną logikę pętli w stanie nienaruszonym. : D – mre

+0

@mre: dziękuję za anwser – jason

Powiązane problemy