Threads stoppen mit interrupt - Frage dazu

Jack159

Bekanntes Mitglied
Hallo,

Als Beispiel sei das Beispiel als Galileo Openbooks "Java ist auch eine Insel" gegeben:


Java:
Thread t = new Thread()
{
  @Override
  public void run()
  {
    System.out.println( "Es gibt ein Leben vor dem Tod.  " );

    while ( ! isInterrupted() )
    {
      System.out.println( "Und er läuft und er läuft und er läuft" );

      try
      {
       Thread.sleep( 500 );
      }
      catch ( InterruptedException e )
      {
       interrupt();
       System.out.println( "Unterbrechung in sleep()" );
      }
    }

    System.out.println( "Das Ende" );
  }
};
t.start();
Thread.sleep( 2000 );
t.interrupt();


Die Ausgabe sieht wie folgt aus:

Es gibt ein Leben vor dem Tod.
Und er läuft und er läuft und er läuft
Und er läuft und er läuft und er läuft
Und er läuft und er läuft und er läuft
Und er läuft und er läuft und er läuft
Unterbrechung in sleep()
Das Ende



Galileo Computing :: Java ist auch eine Insel – 14.3 Thread-Eigenschaften und -Zustände


Ich verstehe dieses Beispiel nicht so ganz...
Der Thread wird gestartet, gibt dann Es gibt ein Leben vor dem Tod. aus und steigt dann in die while-Schleife ein. Dort wird der Thread dann für 0,5 Sekunden schlafen gelegt. Falls das schlafen eine Exception auslöst, wird der Thread unterbrochen, was aber im Normalfall ja nicht geschieht?!

Nach meinem Verständniss müsste dieses Programm doch eine Endlossschleife sein?! Wo ist da mein Denkfehler? ???:L
 

kay73

Bekanntes Mitglied
Code:
t.interrupt();
setzt auch den internen interrupt-Status des Threads, deshalb steigt die while-Schleife aus.
 

pro2

Bekanntes Mitglied
Code:
t.start();
Da wird der Thread t gestartet und läuft dann vor sich hin. Bis er logischerweise unterbrochen wird..

Code:
Thread.sleep( 2000 );
Hier wird der Mainthread quasi, also das Programm, was den Thread t gestartet hat, schlafen gelegt.

Code:
t.interrupt();
Und hier wird t nach 2000ms unterbrochen und die Fehlermeldung erscheint.
 

Jack159

Bekanntes Mitglied
Code:
t.interrupt();
setzt auch den internen interrupt-Status des Threads, deshalb steigt die while-Schleife aus.

Aber da kommt der doch eigentlich nie hin? (Zumindest nach meiner Logik^^)
Im Thread selber wird der Thread ja nicht unterbrochen, außer in dem catch-Block, welcher aber doch sowieso eigentlich nicht erreicht wird?!
 

kay73

Bekanntes Mitglied
Nein, denn nach 2000 ms wird interrupt() aufgerufen. Das kann bei dem erzeugten Thread zwei Effekte haben: Wenn der Thread ich in der while-Schleife befindet und nicht in Thread.sleep() hängt, wird der interne interrupted-Status des Threads des Threads auf true gestzt. Wenn der Thread nach 500ms aufwacht, steigt der Thread aus while Schleife aus. Wenn der Thread in der while-Schleife in sleep() hängt, wird eine InterruptedException geworfen (und der interrupted-Status nicht verändert). Der Thread ruft auf sich selbst noch einmal interrupt() auf was den internen Status wiederum ändert sodass die while-Schleife auch hier aussteigt.
 

Jack159

Bekanntes Mitglied
Nein, denn nach 2000 ms wird interrupt() aufgerufen. Das kann bei dem erzeugten Thread zwei Effekte haben: Wenn der Thread ich in der while-Schleife befindet und nicht in Thread.sleep() hängt, wird der interne interrupted-Status des Threads des Threads auf true gestzt. Wenn der Thread nach 500ms aufwacht, steigt der Thread aus while Schleife aus. Wenn der Thread in der while-Schleife in sleep() hängt, wird eine InterruptedException geworfen (und der interrupted-Status nicht verändert). Der Thread ruft auf sich selbst noch einmal interrupt() auf was den internen Status wiederum ändert sodass die while-Schleife auch hier aussteigt.


Also was ich ja verstehe ist, dass wenn man den Thread praktisch schlafen legt, obwohl er gerade bereits schläft, dann die Exception ausgelöst wird. Dies wird doch mit der Zeile
Java:
Thread.sleep( 2000 );
realisiert, oder? Mein Verständnissproblem ist grad nur, wie er denn bis zu dieser Zeile überhaupt kommt...



Java:
    while ( ! isInterrupted() )
    {
      System.out.println( "Und er läuft und er läuft und er läuft" );

      try
      {
       Thread.sleep( 500 );
      }
      catch ( InterruptedException e )
      {
       interrupt();
       System.out.println( "Unterbrechung in sleep()" );
      }
    }

    System.out.println( "Das Ende" );
  }

Dies ist die gesamte while-Schleife. Nach meiner Logik wird diese while-Schleife doch niemals verlassen?
 

pro2

Bekanntes Mitglied
Ab dieser Zeile
Code:
t.start();
stell dir das so vor, als würden zwei Programme gleichzeitig nebenher laufen. Einmal dein Mainthread und einmal der Thread t. Dein Programm läuft normal weiter, während t auch gleichzeitig läuft und seinen Kram macht. ;-) Das sollte dein Verständnisproblem eigentlich beheben. Dafür sind Threads übrigens gemacht..

Code:
Thread.sleep( 2000 );
legt übrigens deinen Mainthread schlafen, während t fröhlich weiterläuft, da diesers Thread.sleep ja auch aus dem Hauptprogramm ausgeführt wird. Innerhalb von t wird ja auch Thread.sleep ausgeführt, was sich logischerweise dann nur auf t auswirkt. Mit
Code:
t.sleep()
müsstest du t aber auch aus dem Hauptprogramm schlafen legen können (meine ich..).
 
Zuletzt bearbeitet:

Jack159

Bekanntes Mitglied
Jetzt habe ich es verstanden denke ich, habe mir nochmal ein paar Beispiele angeschaut und ausprobiert.

Java:
public class ThreadInterrupt extends Thread {
	
	
	public void run() {
		
		while(isInterrupted() == false)
	    {
	      System.out.println(getState());
	    }   
		
	}
	
		
}

Java:
public class a {

	public static void main(String[] args)
	  {
	    Thread t = new ThreadInterrupt();    
	    t.start();
	 
	    try
	    {
	      Thread.sleep(1000);
	    }
	    catch(InterruptedException ie)
	    {
	     
	    }
	 
	    t.interrupt();    
	  }
	}

Der Thread t wird in der main ganz normal gestartet und läuft ab da an (Zumindest solange die while-Schleife erfüllt ist). Anschließend wird der main-Thread ("main-Methode") für 1 Sekunde schlafen gelegt. Nach dieser 1 Sekunde wird dann der Thread t unterbrochen. Dies bewirkt, dass die while-Schleife des Threads t nicht mehr erfüllt ist und somit der Thread t beendet wird.

So ist es richtig oder?

(Hatte bis eben noch im Kopf, dass alles brav nacheinander abgearbeitet wird, anstatt wirklich parallel....)

Danke für eure Hilfe ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Mehrere Threads starten/stoppen Java Basics - Anfänger-Themen 4
L Zeit stoppen in mehreren Threads Java Basics - Anfänger-Themen 2
frau-u Threads stoppen Java Basics - Anfänger-Themen 11
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
N Pingen in Threads Java Basics - Anfänger-Themen 9
B Threads benutzen Java Basics - Anfänger-Themen 5
E Allgemein Verständnissfrage zum Ablauf mehrerer Threads Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben