Thread isInterrupt

Leyla

Mitglied
Folgender Code gegeben:
Java:
public void run() {
    while (!(Thread.currentThread().isInterrupted())) {
        try {
             Thread.sleep(2000);
            } catch (InterruptedException e) {
             this.interrupt();
            }
    }
}

Meine Frage ist, warum muss man "this.interrupt()" ausführen, wenn der Thread durch Thread.sleep() bereits unterbrochen wird. Und gehen wir mal davon aus in Thread.sleep() tritt eine InterruptedException auf. Wieso muss man den Thread dann noch mit interrupt beenden, wenn ja schon der Thread interrupted ist?
 

Marinek

Bekanntes Mitglied
Was genau macht denn diese Methode bei dir?

Du bist ja vermutlich in einer Runable ... Diese hat keine interupt() Methode.
 

KonradN

Super-Moderator
Mitarbeiter
Die Frage ist aber doch, was das für eine Methode interrupt() ist.

Habt Ihr evtl. von Thread geerbt? Dann wäre es diese Methode:
Thread (Java SE 17 & JDK 17) (oracle.com)
Interrupts this thread.
Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.
If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int) methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
If this thread is blocked in an I/O operation upon an InterruptibleChannel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.
If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.
If none of the previous conditions hold then this thread's interrupt status will be set.
Interrupting a thread that is not alive need not have any effect.
Und hier sollte der Punkt "If none of the previous conditions hold then this thread's interrupt status will be set." der wichtige sein. Es wird also durch diesen Aufruf der interrupt status gesetzt. Du kannst also über isInterrupted() abfragen, ob der Thread unterbrochen wurde. Das kann evtl. interessant sein, weil Du dann eine Schleife verlassen willst oder so (Was man aber auch in dem catch Block machen könnte...).

Aber wenn man einen neuen Thread erstellt, dann ist es eher unüblich, von Thread zu erben. Statt dessen wird Runnable implementiert.
Und die Gedanken von mir sind natürlich nur valide, wenn Du von Thread erbst. Wenn Du nicht von Thread erbst, dann musst Du schauen, was Du für eine Methode interrupt Du hast. Denn da kann es folgende Fälle geben:
  • Du hast die Methode in der Klasse geschrieben - dann schau an, was sie macht und gut ist es.
  • Du erbst von etwas, das diese Methode implementiert - dann schau Dir das an über Dokumentation oder den Source.
  • Du bekommst evtl. auch einfach einen Compile Fehler, weil es die Methode nicht gibt.

Ohne Details können wir aber nur raten - daher ist es an Dir, da Details zu nennen. Wir können da sonst nur raten.
 

Hough

Mitglied
Folgender Code gegeben:
Java:
public void run() {
    while (!(Thread.currentThread().isInterrupted())) {
        try {
             Thread.sleep(2000);
            } catch (InterruptedException e) {
             this.interrupt();
            }
    }
}

Meine Frage ist, warum muss man "this.interrupt()" ausführen, wenn der Thread durch Thread.sleep() bereits unterbrochen wird. Und gehen wir mal davon aus in Thread.sleep() tritt eine InterruptedException auf. Wieso muss man den Thread dann noch mit interrupt beenden, wenn ja schon der Thread interrupted ist?
Muß man nicht. Wenn du in Zeile 6 den Thread beenden möchtest, kannst du dort auch ein return oder ein break schreiben.
 

Leyla

Mitglied
Die Frage ist aber doch, was das für eine Methode interrupt() ist.

Habt Ihr evtl. von Thread geerbt? Dann wäre es diese Methode:
Thread (Java SE 17 & JDK 17) (oracle.com)

Und hier sollte der Punkt "If none of the previous conditions hold then this thread's interrupt status will be set." der wichtige sein. Es wird also durch diesen Aufruf der interrupt status gesetzt. Du kannst also über isInterrupted() abfragen, ob der Thread unterbrochen wurde. Das kann evtl. interessant sein, weil Du dann eine Schleife verlassen willst oder so (Was man aber auch in dem catch Block machen könnte...).

Aber wenn man einen neuen Thread erstellt, dann ist es eher unüblich, von Thread zu erben. Statt dessen wird Runnable implementiert.
Und die Gedanken von mir sind natürlich nur valide, wenn Du von Thread erbst. Wenn Du nicht von Thread erbst, dann musst Du schauen, was Du für eine Methode interrupt Du hast. Denn da kann es folgende Fälle geben:
  • Du hast die Methode in der Klasse geschrieben - dann schau an, was sie macht und gut ist es.
  • Du erbst von etwas, das diese Methode implementiert - dann schau Dir das an über Dokumentation oder den Source.
  • Du bekommst evtl. auch einfach einen Compile Fehler, weil es die Methode nicht gibt.

Ohne Details können wir aber nur raten - daher ist es an Dir, da Details zu nennen. Wir können da sonst nur raten.
Genau das meine ich. Es geht um eine beliebige Klasse die von Thread erbt.

Genau das verstehe ich nicht. Wenn Threads.sleep eine InterruptedException wirft, dann ist der Threads doch eigentlich unterbrochen worden. Meine Frage ist daher warum man noch explizit this.interrupt ausführen muss
 

KonradN

Super-Moderator
Mitarbeiter
Genau das verstehe ich nicht. Wenn Threads.sleep eine InterruptedException wirft, dann ist der Threads doch eigentlich unterbrochen worden. Meine Frage ist daher warum man noch explizit this.interrupt ausführen muss
Wenn Du einen Thread hast, der lange oder gar unbegrenzt läuft, dann willst Du den oft einen Mechanismus haben, diesen von außen anhalten zu können. Dazu hat Thread interrupt() und isInterrupted(). Du kannst also im Thread regelmäßig prüfen, ob der Thread unterbrochen wurde oder nicht.

Die Frage ist aber, wie dieses Flag gesetzt werden kann. Und da kommt man auf interrupt(). Da muss man dann die Dokumentation lesen um das Verhalten zu verstehen und ich habe diese ja schon gebracht. Wenn ein Thread in einem sleep ist (und bei ein paar anderen Dingen), dann wird dieses Flag aber nicht gesetzt:
If this thread is blocked in an invocation of the .... sleep(long), or sleep(long, int) methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
"then its interrupt status will be cleared and it will receive an InterruptedException" ==> Der Thread ist also nicht markiert als interrupted. Damit man diese Unterbrechung aber noch nachvollziehen kann, wird der Status durch den Aufruf von interrupt() gesetzt. Damit ist auch im Anschluss noch bekannt, dass der Thread unterbrochen wurde.
Ohne diesen Aufruf könnte man nach dem Block nicht sagen, ob der sleep komplett durchgelaufen wurde oder ob es ein Signal von außen gab zur Unterbrechung.
 

Blender3D

Top Contributor

Nouser

Mitglied
In der Konstellation mußt du nur irgendetwas machen um bei einem Interrupt Signal aus dem while loop zu kommen.
Wird sleep unterbrochen, löscht es den interrupted status und wirft eine Exception. Im catch block willst du nun den loop irgendwir verlassen. Das kannst du, indem du (wie schon erwähnt) break ausführst oder den interrupted status wieder setzt, so daß die Abbruchbedingung im Kopf der while-Schleife erfüllt ist.

Alternativ tauscht du einfach das try-catch / while nesting (try umschließt while). Wird sleep unterbrochen, dann ist der catch block außerhalb der Schleife und es geht einfach im Code weiter.
 

Leyla

Mitglied
In der Konstellation mußt du nur irgendetwas machen um bei einem Interrupt Signal aus dem while loop zu kommen.
Wird sleep unterbrochen, löscht es den interrupted status und wirft eine Exception. Im catch block willst du nun den loop irgendwir verlassen. Das kannst du, indem du (wie schon erwähnt) break ausführst oder den interrupted status wieder setzt, so daß die Abbruchbedingung im Kopf der while-Schleife erfüllt ist.

Alternativ tauscht du einfach das try-catch / while nesting (try umschließt while). Wird sleep unterbrochen, dann ist der catch block außerhalb der Schleife und es geht einfach im Code weiter.
Genau da liegt mein Verständnisproblem.

Schritt 1: Thread wird gestartet.
Status von isInterrupted = false;

Schritt 2: In Try-Catch wird durch Thread.sleep eine Exception geworfen
Status von Status von isInterrupted = true;

Jetzt verstehe ich nicht warum es noch ein .interrupt() geben muss, wenn der Status jetzt schon auf true ist. Weil man dadurch ja schon aus der Schleife geht
 

Nouser

Mitglied
Genau da liegt mein Verständnisproblem.
Konrad hat oben schon die Docs zu sleep(long) verlinkt.
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
Heißt also z.B,
  • du setzt das interrupted flag.
  • sleep() prüft, ob das interrupted flag gesetzt ist, wenn ja, wird das flag gelöscht und eine InterruptedException ausgelöst.
  • wenn du nun im catch block das flag nicht erneut setzt (mit Thread.interrupt()), ist auch die Schleifenbedingung weiterhin erfüllt und sie wird nicht abgebrochen.
sleep() setzt also den interrupted status wieder zu false und du gehst einfach von einer falschen Annahme aus.
 

Leyla

Mitglied
Konrad hat oben schon die Docs zu sleep(long) verlinkt.

Heißt also z.B,
  • du setzt das interrupted flag.
  • sleep() prüft, ob das interrupted flag gesetzt ist, wenn ja, wird das flag gelöscht und eine InterruptedException ausgelöst.
  • wenn du nun im catch block das flag nicht erneut setzt (mit Thread.interrupt()), ist auch die Schleifenbedingung weiterhin erfüllt und sie wird nicht abgebrochen.
Was heißt hier genau "flag gelöscht" ?
 

Nouser

Mitglied
Was heißt hier genau "flag gelöscht" ?
Wie das genau umgesetzt wird ist Sache der JVM. Stell es dir als
Java:
boolean interrupted;
in der Thread Klasse vor.

rufst du Thread.interrupt() auf, dann wird das boolean zu true gesetzt. sleep() checkt nun immer mal wieder, ob das interrupt flag gesetzt ist (das Boolean true ist), und wenn ja, löscht das flag, setzt es also wieder zu false und wirft die InterruptedExeption.

Das ist schon alles.
 

bibber

Neues Mitglied
Gesehen? https://stackoverflow.com/questions...n-thread-interrupted-and-thread-isinterrupted

Ein weiterer Unterschied ist, dass interrupted() auch den Status des aktuellen Threads löscht. Mit anderen Worten: Wenn Sie die Funktion zweimal hintereinander aufrufen und der Thread zwischen den beiden Aufrufen nicht unterbrochen wird, gibt der zweite Aufruf false zurück, selbst wenn der erste Aufruf true zurückgegeben hat.

Alles weitere steht dann in den Javadocs dazu.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
L Compiler-Fehler Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 2
F Exception in thread main java.lang.StackOverflowError Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben