# Thread nach Timeout beenden



## stefan. (22. Jul 2009)

Hallo,

ich möchte zuerst einen Thread starten, auf dessen Beendigung warten oder mittels Timeout diesen abbrechen.

Main

```
public class Main {
	public static void main(String[] args) {
		ThreadItem i=new ThreadItem();
		Thread t=new Thread(i);
		System.out.println("main: starte thread");
		t.start();
		
		try {
			System.out.println("main: warte auf thread");
			t.join(5000);
			System.out.println("main: thread fertig oder Timeout");
			if(t.isAlive()) {
				System.out.println("interrupt thread");
				t.interrupt();
			}
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Main: beende main()");
		
	}
}
```

Thread

```
import java.util.concurrent.TimeUnit;

public class ThreadItem implements Runnable {

	@Override
	public void run() {
		while(!Thread.interrupted()) {
			System.out.println("Thread: bin da ..");
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
		}
	}
}
```

Die main() soll zunächst 5 Sekunden auf den Thread warten, wenn dieser dann noch läuft, soll dieser beendet werden.

Ausgabe des Programms:

```
main: starte thread
main: warte auf thread
Thread: bin da ..
Thread: bin da ..
Thread: bin da ..
main: thread fertig oder Timeout
interrupt thread
Main: beende main()
Thread: bin da ..
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Unknown Source)
	at java.util.concurrent.TimeUnit.sleep(Unknown Source)
	at de.ThreadItem.run(ThreadItem.java:12)
	at java.lang.Thread.run(Unknown Source)
Thread: bin da ..
Thread: bin da ..
```

Wieso läuft der Thread nachdem Interrupt trotzdem weiter und wie kann ich den Thread beenden ?


----------



## SlaterB (22. Jul 2009)

lies dir die Beschreibung zur Methode interrupt() durch,
oben im Code ist ja Thread als Link zur API dargestellt

beim Empfang der Exception kannst du eine boolean-Variable auf true/ false setzen und diese in der Schleifenbedingung ZUSÄTZLICH testen
oder direkt return; ausführen, falls du nichts weiter machen willst


----------



## stefan. (22. Jul 2009)

Danke. Hatte gedacht interrupt() macht genau das was ich will, aber man sollte wohl manchmal lieber (nach) gucken statts denken


----------

