Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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
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
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?!
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.
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?
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..).
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....)