Ich habe hier ein Programm, in dem 1 Thread erzeugt wird, welcher alle 500ms "Hallo" ausgibt. Dieser Thread soll nach 3 Sekunden unterbrochen werden (Geschieht in der main, indem ich die main 3 Sekunden schlafen lege und dann den Thread unterbreche).
Das ganze funktioniert aber irgendwie nicht, der Thread wird nicht beendet und gibt weiterhin "Hallo" aus....
lies doch irgendwo nach, was genau bei einem interrupt denn passiert,
wozu ist deiner Meinung nach wohl das try/catch mit InterruptedException da?
ob es zu der Exception kommen mag? was tust du dann im catch, wie geht es danach weiter?
lies doch irgendwo nach, was genau bei einem interrupt denn passiert,
wozu ist deiner Meinung nach wohl das try/catch mit InterruptedException da?
ob es zu der Exception kommen mag? was tust du dann im catch, wie geht es danach weiter?
Wenn die Ausgabe nur jede halbe Sekunde stattfindet, befindet sich der Thread fast die gesamte Zeit über in der Schlafmethode sleep(). Also wird vermutlich der interrupt() den Thread gerade beim Schlafen stören. Genau dann wird sleep() durch InterruptedException unterbrochen, und der catch-Behandler fängt die Ausnahme ein. Jetzt passiert aber etwas Unerwartetes: Durch die Unterbrechung wird das interne Flag zurückgesetzt, sodass isInterrupted() meint, die Unterbrechung habe gar nicht stattgefunden. Daher muss interrupt() erneut aufgerufen werden, da das Abbruch-Flag neu gesetzt werden muss und isInterrupted() das Ende bestimmen kann.
Bedeutet also, dass das interrupt() im catch Block nur nochmal zur "Sicherheit" da steht? Also eben für den Fall, dass wenn wir den Thread unterbrechen und sich der Thread grad in .sleep() befindet, er dann die Exception auslöst (somit wieder auf isInterrupted()=false gesetzt wird) er dann im catch Block nochmal unterbrochen wird?
Bedeutet also auch, dass nicht immer bzw. nicht unbedingt durch t1.interrupt() eine Exception ausgelöst wird oder? Wenn der Thread jetzt sehr viel mehr zu tun hätte und viel weniger schlafen würde, dann könnte es doch sein, dass wir den Thread gerade dann unterbrechen von außen, wenn dieser zur Zeit nicht in der .sleep() steckt und somit auch nicht der catch Block ausgeführt wird?!
Wenn ich das jetzt richtig widergegeben habe, habe ich es denke ich verstanden
das interrupt() im catch-Block ist keine Sicherheit, sondern genau dafür da das Flag zu setzen,
sonst wird es nicht gesetzt (bei interrupt() von außen während sleep) und die siehst was rauskommt,
Sicherheit würde ich das nicht nennen, notwendigen Befehl,
ich hatte übrigens auf die Schnelle gar nicht gesehen dass du interrupted() prüfst und war auf ein break; oder return; im catch aus,
so ist es natürlich sauberer
ich meinte in allen Fällen zu reagieren, nicht nur bei sleep() durch das catch,
aber du machst es ja richtig,
ich persönlich setze immer von außen einen eigenen boolean, der geprüft wird,
und das interrupt() gerade nur um ein evtl. sleep() abzukürzen, in dem Fall muss dann auch im catch nichts passieren,
das eigene boolean steht unter voller Kontrolle und unterliegt nicht solchen Spielerein wie Löschen des Status