Threads

Caruso_Nix

Mitglied
Hallo,
ich bin noch ein ziemlicher Neuling in Java und habe da ein Problem.
Derzeit arbeite ich mit Threads. Nun möchte ich einen Thread nach einer bestimmten Zeit, per interrupt beenden. Aber ich weiss nicht, wie ich das realisieren kann.
Kann mir jemand helfen?
Danke Caruso
 
Du könntest üer die TimerTask klasse gehen.

implementiert Runnable und das bedeutet, das es die Thread funktionalität hat. Kannst hier über die scheduledExecutionTime, die laufzeit festlegen. Ist die Einfachste Methode.

Oder:

Du gehst über einen zweiten Thread, welchem du den ersten mitgibst.

Thread thread1=new Thread { implementierung des auszuführenden Threads}
pseudotimer timer1=new pseudotimer(thread1);
thread1.start();
timer1.start();


class pseudotimer extends Thread {
Thread test;
public pseudotimer(Thread t) {
super();
this.test=t;
}

public void run() {
this.sleep(<anzahl der Sekunden, die er warten soll>);
this.test.interrupt();
}
}


Und das wars dann.


Viel Erfolg

Torsten
 
ui, doch noch nicht.

mit einem Thread läuft es, aber was mache ich, wenn mehrere laufen? ich habe in einem anderen Thema dazu ein Semaphoren gefunden. Dieser bezieht sich allerdings auf eine globale Variable. Das nutzt mir ja nichts, da ich dann ja alle Threads stoppe, wenn der Semaphoren false ist.
Wie kann ich das geschickter machen?
caruso

Code:
public class Test extends Thread {
 
public static boolean semaphor;
private int i = 0;
 
public void run()
{
while(semaphor)
{
doAnything();
}
}
 
public static void startThread(Thread t){
semaphor = true;
t.start();
}
public static void stopThread(Thread t){
semaphor = false;
}
 
public void doAnything(){
System.out.println(i); 
i++;
}
 
public static void main(String[] args) {
Thread t1 = new Test();
startThread(t1);
pseudotimer timer1=new pseudotimer(t1,5);
timer1.start();
 
Thread t2 = new Test();
startThread(t2);
pseudotimer timer2=new pseudotimer(t1,2);
timer2.start();
 
Thread t3 = new Test();
startThread(t3);
pseudotimer timer3=new pseudotimer(t1,5);
timer3.start();
}
 
} 
class pseudotimer extends Thread {
Thread test;
int time;
 
public pseudotimer(Thread t, int time) {
super();
this.test=t;
this.time=time;
} 
public void run() {
try {
System.out.println("TIME");
this.sleep(1000*time);
System.out.println("TIME UP");
Test.stopThread(this.test);
}
catch ( InterruptedException ie ){System.err.println( ie );}
 
}
}
 
Dann musst du etwas komplexer denken,

du erwähntest ja nur, dass du es mit einem Thread machen willst.
Natürlich gibt es die umständliche und ressourcenfressende methode zu jedem Thread einen pseudotimer aufzumachen. Ist aber nicht zu empfehlen.

Oder du machst eine Thread liste und musst in jedem thread die zeit mitspeichern wann er aufgerufen wurde und in gewissen abständen schauen, welche threads über dem aufrufzeit+zeitlimit drüber sind.

Wäre eine Möglichkeit, welche mir so spontan einfallen würde.

Müsste dann ungefähr so aussehen die Pseudotimer klasse:
public class pseudotimer{
private thread test;
private List threadlist;
public pseudotimer(Thread t, int time) {
super();
this.test=t;
this.time=time;
this.threadlist.add(thread);
}

public addThread(Thread t) {
this.threadlist.add(t);
}

endOvertimeThreads() {
Iterator i=this.threadlist.iterator();

while (i.hasNext()) {
Thread temp=(Thread) i.item();
if (temp.getstartTime()>Calendar.getTime()) {
temp.interrupt();
}
i.next();
}
public void run() {
try {
while (true) {
System.out.println("TIME");
this.sleep(1000*time);
endOvertimeThreads();
}
}
catch ( InterruptedException ie ){System.err.println( ie );}

}
}


Grüsse

Torsten

P.S.: Keine garantie, dass der code oben 1:1 läuft, können sich fehler eingeschlichen haben, ist ja auch nur da um einen überblick zu geben, wie es laufen könnte.
 
Zuletzt bearbeitet:
...warscheinlich ja, denn torsch2711 scheint "intelligente" Threads zu meinen :p :

Code:
public class IntelligenterThread extends Thread {
 
private long zeit = 0;
 
public IntelligenterThread() {
  super();
}
 
public void start() {
  this.zeit = System.currentTimeMillis();
  super.start();
}
 
public long getStartTime() {
  return zeit;
}
 
}

CU schnuffie
 
jep, kann mich schnuffie nur anschliessen. War eigentlich auch im Text beschrieben.

Ich denke das ist die einzige Möglichkeit. Lass mich aber gerne von anderen Korrigieren.

Ausserdem hab ich ja nur die Pseudotimerklasse beschrieben... ;)
 
Zuletzt bearbeitet:
Caruso_Nix hat gesagt.:
Was meinst du denn mit:

temp.getstartTime()>Calendar.getTime()

muss ich mir die Methode temp.getstartTime() noch selbst schreiben

wobei sich die Starttime aus der Startzeit des Threads und des Zeitlimits zusammensetzt, das kam nicht gut raus, ich gebe es zu.
eigentlich müsste es dann getEndTime heissen. Okay, okay, mein Fehler.

:rolleyes:
 
...eine noch ergänzende Bemerkung wäre, daß sich Threads noch lange nicht durch "start()" starten lassen und somit die Startzeit eigentlich erst mit dem Aufruf der "run()"-Methode gesetzt werden kann. :-(
 
Zurück