# Thread nach X-Sekunden beenden



## Klause (30. Jul 2008)

Hallo zusammen 
Ich habe mehrere Threads gestartet und jeder hat eine random-Sekundenanzahl bei der Initialisierung übergeben bekommen. Nun möchte ich, dass der Thread sich selbst nach XY Sekunen beendet.
Wenn ich innerhalb meiner public void run()  sleep aufrufe hält der Thread ja an... Aber ich möchte da erso lange "seine Sachen tut" bis die Zeit abgelaufen ist.

Hat jemand von Euch eine Idee?
Besten Dank.


----------



## ReatKay (30. Jul 2008)

mhn...

wie wärs so?


```
long zeitdauer = "WUnschzeit";
long maxTime = System.microtime() + zeitdauer ;

while (System.microtime < maxTime)
{
   // do was du willst ;)
}

// Thread beenden
```
[/code]


----------



## SlaterB (30. Jul 2008)

beim Start merkst du dir die Systemzeit und in der run schaust du 'ab und zu' nach der aktuellen Systemzeit und merkst, wann die Lebenszeit abgelaufen ist,

das 'ab und zu' kann man natürlich beliebig implementieren,
je nachdem, was die normale Aufgabe des Threads ist,
wenn das eine Schleife einer Aktion ist, die wenige Ms dauert, dann macht es Sinn, am Ende dieser Schleife einmal zu prüfen,

wenn der Thread hauptsächlich nix macht, dann sollte man die sleep()-Aufrufe so wählen, dass oft genug noch nach der Lebenszeit geschaut wird,
denkbar ist auch, die verbleibende Lebenszeit auszurechnen und genau so lange zu schlafen


edit:
zum Beispiel von ReatKay ist zu sagen, dass der Thread möglichst nicht 100% CPU-Auslastung nur zum Püfen der Zeit verwenden sollte,
wenn die Schleife noch andere Aktionen enthält, dann kann es ok sein, ansonsten unbedingt auch sleep() verwenden


----------



## Klause (30. Jul 2008)

Vielen Dank,
die Tips haben mir geholfen


----------



## Klause (30. Jul 2008)

Hab noch eine Frage 
Das Thread-beenden macht mir noch probeme...
Die methode stop() habich ja nicht verfügbar, damit sich der Thread selber beendet...
Die anderen Funktionen die mir angeboten werden hab ich mir angeschaut, aber irgendwie nichts brauchbares gefunden.

Danke im Voraus,
Klaus


----------



## Niki (30. Jul 2008)

Ein Thread ist dann beendet wenn die run Methode fertig ist. Also brauchst du einfach eine Möglichkeit diese zu beenden. Entweder mit return, oder ganz normal. Oder du steuerst eine Schleife mit einem Flag.... Auf dem Thread Objekt selber brauchst du aber keine Methode aufrufen (falls doch, dann verwende interrupt und isInterrupted)


----------



## xysawq (30. Jul 2008)

Du könntest auch einen Timer verwenden... hab das jetzt zwar nicht besonders schön programmiert, aber es läuft wunderbar, schont den Prozessor und man muss selber nichts prüfen.


```
import java.util.Timer;
import java.util.TimerTask;

public class ToDo extends TimerTask
{
	Timer timer = new Timer();
	int time = 0;
	boolean run = false;
	Running running = new Running();

	public void run()
	{
		if(!run)
		{
			run = true;
			running.start();
		}
		else
		{
			timer.cancel();
			run = false;
		}
	}
	
	public void setTime(int time)
	{
		this.time = time;
	}
	
	public void start()
	{
		timer.scheduleAtFixedRate(this, 0, time);
	}
	
	private class Running extends Thread
	{
		public void run()
		{
			while(run)
			{
				//Was auch immer getan werden soll.
			}
		}
	}
}
```

Aufruf und Start funktionieren z.B. so:

```
public class Main
{
	public static void main(String[] args)
	{
		ToDo todo = new ToDo();
		
		todo.setTime(5000);
		
		todo.start();
	}
}
```

Damit das ganze auch prozessorschonend bleibt sollest du sowas wie:

```
try
{
	Thread.sleep(0, 5000);
}
catch (InterruptedException e)
{}
```
am Ende deiner while(run)-Schleife setzten, damit der Prozessor eine kleine Pause hat .


----------

