2016-06-01 11 views
0
public static void main(String[] args) { 
    Thread thread = new Thread(new Runnable() { 
     public void run() { 
      try { 
       Thread.sleep(99999); 
      } 
      catch(InterruptedException e) { 
       System.out.println("I'm interrupted!!"); 
      } 
     } 
    }); 

    thread.start(); 
    out.print(thread.isAlive()+" "); 
    thread.interrupt(); 
    out.print(thread.isAlive()+" "); 
} 

Ich verstehe nicht, warum die KonsoleSchwierigkeiten zu verstehen, das Verhalten des thread.interrupt() -Methode

true true ist, ich bin unterbrochen !!

, aber ich denke, das Ergebnis

wahr unterbrochen ich bin !! true

Warum ist nicht das Ergebnis, was ich denke? Vielen Dank!

+0

Threads laufen "parallel", wenn sie nicht synchronisiert sind. "Parallel" bedeutet, dass es keine Garantie für die Reihenfolge gibt, in der Dinge in verschiedenen Threads passieren werden. Ihr zweiter Thread kann unmöglich "Ich bin unterbrochen" drucken, bevor der erste Thread ihn unterbricht - das ist ein Beispiel für die Synchronisation - aber dann erlaubt Ihr Programm, dass der Aufruf println() und der zweite Ausdruck 'thread.isAlive' in _in erfolgt parallel_. Das heißt, es gibt keine Garantie, welche dieser Dinge zuerst eintreten werden. –

Antwort

2

TL; DR: Die Thread#interrupt() Methode eine InterruptedException Ausnahme nicht unmittelbar betreffen, lediglich eine interne Flag setzt, um true Interrupt-Status benannt ist, wobei dies hier dann durch das betroffene Gewinde überprüft.

Der Interrupt-Mechanismus wird mithilfe eines internen Flags implementiert, das als den Interrupt-Status bekannt ist. Der Aufruf von Thread.interrupt setzt dieses Flag. Wenn ein Thread nach einem Interrupt durch Aufrufen der statischen Methode Thread.interrupted sucht, wird der Interruptstatus gelöscht. Der nicht statische Thread.isInterrupted, der von einem Thread zum Abfragen des Interrupt-Status eines anderen verwendet wird, ändert nicht den Interrupt-Status Flag.

So kommt es, eine minimale Verzögerung zwischen dem Satz des Interrupt-Status und dem Werfen der InterruptedException, zu erklären, warum Ihr Druck I'm interrupted!! nach Ihren beiden Anrufen Thread.isAlive() passiert.

+0

Danke für Ihre Antwort !! –

+0

Gern geschehen;) – Mik378

+0

Ich merke, dass Sie neu sind, also wenn Sie denken, dass die Antwort Ihnen geholfen hat, könnten Sie es validieren;) – Mik378

1

Es ist ein Timing-Problem.

Wenn Ihr Haupt-Thread fortfährt und thread.isAlive() druckt, bevor thread tatsächlich beendet wird, wird true gedruckt. Sie können dies einfach überprüfen, indem Sie am zweiten Ausgang einen Haltepunkt setzen und einige Augenblicke warten, bevor Sie das Programm fortsetzen können. Es wird false für den zweiten isAlive Scheck drucken.

Wahrscheinlich ist die Ausgabe Ihres Programms von Zeit zu Zeit unterschiedlich, abhängig von den Kontextwechsel zwischen Ihrem Haupt-Thread und dem anderen Thread.

Eigentlich können Sie nicht einmal sicher sein, dass Ihr zweiter Thread bereits in dem Moment schläft, in dem Sie den Status des Threads abfragen. Wenn Sie die Ausführungsreihenfolge der Threads voneinander abhängig machen möchten, müssen Sie eine Synchronisierung zwischen den Threads einführen.

+0

Ich hatte einen Breakpoint am zweiten output.Exactly gesetzt, zweite out.print zeigt falsch. Danke für Ihren Vorschlag. –

Verwandte Themen