Threads

ich habe das mal ausprobiert, aber ich scheitere :-(

folgender Ablauf ist geplant:
speicher threadName und Endzeit ab
starte den Thread
----

zweiter tread überprüft alle 10 sek, ob es überfällige Threads gibt.
schaue in der Speicherung, ob Endzeit < currentTime.
wenn ja: 1. lösche den Eintrag aus der Speicherung
2. unterbreche den Task
------------------------------------------------------------------------------------

tja und hier stosse ich doch auf Probleme.
welche Speicherung sollte ich verwenden? Ich muss anfügen, rauslöschen, finden(über die Endzeit).
Bei einer Iteration kann ich ja nur (object, int) verwenden. Das Problem ist, dass die Endzeit long ist.
Hashmap kann ich nur über den Key ansprechen. Also nur den Namen...suche über die Zeit hab ich nicht hinbekommen.

Ich weiss nicht mehr weiter :(
caruso
 
Für alle primitiven Variablentypen gibt's Wrapper-Klassen:

Code:
long l = 7L;
Long longWrapper = Long.valueOf(l);
myHashtable.put("key", longWrapper);
 
//...
 
long zahl = ((Long)myHashtable.get("key")).longValue();
CU schnuffie
 
Ich glaube du verstehst das nicht ganz,

die Zeit soll in einer Erweiterung der Klasse thread liegen.
sprich sowas:

public class extThread extends Thread {

private long endTime;
private long duration;
public extThread(long tduration) {

super();
this.duration=tduration;
}

public void run() {
this.endTime=System.getMilliSeconds()+this.duration;
/*
doit! hier der Thread code

*/

}
public long getEndTime() {
return this.endTime;
}

}



jetzt gehst du hin und rufst deine pseudotimer klasse auf in welcher du eine liste verwaltest mit löschen, hinzufügen etc. und addest deine Threads.


public pseudotimer(extThread t) {
super();
list.add(t);
}

in der run machst du folgendes:

public void run() {
while(true) {
thread.sleep(<anzahl der millisekunden, welche du warten willst>);
Iterator it=list.iterator();
while (it.hasNext()) {
extThread tempthread=(extThread) it.next.item();
if (tempthread.getEndTime()>System.getMilliSeconds()) {
tempthread.interrupt();
}

}
}
}


thats it.
Ich glaube besser kann man das jetzt auch nicht mehr schreiben.....
 
schnuffie hat gesagt.:
Das geht natürlich mit allen Collections, also z.B. auch mit ArrayList oder HashSet, die dann keinen Key benötigen. ;-)


Hehe, okay, schnuffie war früher dran. Hab aber auch nochmal nen schönen code hingezaubert, welcher dir helfen dürfte.
 
...mir ist da noch so ein Geistesblitz :rolleyes: gekommen:

Code:
public abstract class TimeRunnable extends Runnable {
 
private long start = 0;
private long end = 0;
 
public final void run() {
start = System.currentTimeMillis();
run();
end = System.currentTimeMillis();
}
 
public abstract boolean run();
 
public long getStart() {
return start;
}
 
public long getEnd() {
return end;
}
 
}

Ableitung:

Code:
public class MyTimeRunner extends TimeRunnable {
 
public boolean run() {
	System.out.println("http://www.webnobis.com");
	return true;
}
 
}

Verwendung:

Code:
TimeRunnable runner = new MyTimeRunner();
Thread t = new Thread(runner);
t.start();

CU schnuffie ;-)
 
Hmm, das löst aber sein problem nicht, da er ja alle threads die eine gewisse laufzeit überschreiten, sprich die startzeit des Threads + die laufzeit nicht einhalten, erzwingen will, dass sie beendet werden, du lässt sie laufen und schaust am ende nach wie lange sie gelaufen sind. Bringt ihm hier herzlich wenig, dann brauch er sie auch nicht mehr abschiessen.



Grüsse

Torsten
 
...man müßte die Threads bei einem "Haupt-Thread" registrieren und diesen "Haupt-Thread" ständig laufen lassen und checken, wie lange die anderen Threads bereits laufen:

Code:
public class TimeThread extends Thread {
 
private long start;
 
public TimeThread(Runnable r) {
	super(r);
}
 
public void start() {
	start = System.currentTimeMillis();
	super.start();
}
 
public long getRuntime() {
	return System.currenTimeMillis() - start;
}
 
}
 
 
 
public class Runner extends Thread {
 
private List runner;
private List list = new ArrayList();
private long maxTime;
 
public Runner(List runner, long maxTime) {
	super();
	this.runner = runner;
	this.maxTime = maxTime;
}
 
public void start() {
	if (runner != null && !runner.empty()) {
	 TimeThread t;
	 Iterator it = runner.iterator();
	 while (it.hasNext()) {
		t = new TimeThread((Runnable)it.next());
		list.add(t);
		t.start();
	 }
	}
}
 
public void run() {
	while (!list.empty()) {
	Iterator it = list.iterator();
	TimeThread t;
	while (it.hasNext()) {
	 t = (TimeThread)it.next();
	 if (t.getRuntime() > maxTime) {
		t.interrupt();
		list.remove(t);
	 }
	}
	try {
	 Thread.sleep(1000);
	}
	catch (InterruptedException ie) {}
	}
}
 
}

CU schnuffie

Na, und wie jetzt? :suspekt:
 
Zurück