Hi.
folgendes problem: ich starte einen thread und will, dass dieser, wenn er nach einer gewissen zeit nicht abgearbeitet ist, gestopt wird. hab bereits einiges versucht. aber nichts funktionierte zu meiner zufriedenheit.
hat jemand einen vorschlag?
timeout Thread?
-
-
Ich würde einen zweiten Thread starten, der den ersten überwacht und falls nötig beendet. Der erste Thread müsste vielleicht noch über den zweiten Bescheid wissen, damit er einen Shutdown hinaus zögern kann. Klingt so, als wäre das Observer-Pattern hier passend.
Vielleicht hilft dir aber auch ein java.util.TimerTask. Dessen Doku schreibt dazu:
ZitatA task that can be scheduled for one-time or repeated execution by a Timer.
Klingt gut. -
Mach 2 Threads, einer überwacht den anderen.
mfg Oliver -
-
Zitat von deSertXtall
gibts eigentlich auch ne andere möglichkeit einen Thread zu stoppen ausser mit der stop()? hab version 1.4.2.
Schlechte Idee. Solltest immer einen Blick in die JavaDoc werfen.Zitat von http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html#stop()Deprecated. This method is inherently unsafe. Stopping a thread with Thread.stop causes it to unlock all of the monitors that it has locked (as a natural consequence of the unchecked ThreadDeath exception propagating up the stack). If any of the objects previously protected by these monitors were in an inconsistent state, the damaged objects become visible to other threads, potentially resulting in arbitrary behavior. Many uses of stop should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. If the target thread waits for long periods (on a condition variable, for example), the interrupt method should be used to interrupt the wait. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
Die hier beschriebene Methode ist laut JavaDoc die einzig sichere zur Beendung eines Threads. -
Mach deine eigene stopNow() methode, welche dazu führt, das run() returned. Dieses stopNow wird von dem anderen Thread aufgerufen.
mfg Oliver -
Zitat von Zentor
Mach deine eigene stopNow() methode, welche dazu führt, das run() returned. Dieses stopNow wird von dem anderen Thread aufgerufen.
mfg Oliver
Na du Papagei ;). Irgendwie find ich's ja komisch .. ich poste was, und ein paar Stunden später meldest du dich und schlagst genau das selbe vor. -
wie? eine methode welche eine methode retourniert? versteh ich ned...
-
Der überwachte Thread:
Code
Alles anzeigenpublic class MyObservedThread extends Thread { private boolean keepRunning = true; public void run() { while (keepRunning) { System.out.println("Hello, World!"); } } public void stopThread() { keepRunning = false; } }
Der überwachende Thread:Code
Alles anzeigenpublic class MyKillerThread { private MyObservedThread _observedThread; private int _timeToWaitInSeconds; public MyKillerThread(MyObservedThread observedThread, int timeToWaitInSeconds) { if (observedThread == null) { throw new IllegalArgumentException( "Please specify a Thread instance to observe it."); } if (timeToWaitInSeconds < 0) { throw new IllegalArgumentException( "timeToWaitInSeconds should be a positive number."); } _observedThread = observedThread; _timeToWaitInSeconds = timeToWaitInSeconds; } public void run() { try { Thread.sleep(_timeToWaitInSeconds * 1000); } catch (InterruptedException igonore) { } finally { _observedThread.stopThread(); } } }
MyKillerThread erhält eine Instanz eines MyObservedThread, schläft die angegebene Zeit und stoppt den MyObservedThread durch den Aufruf der Methode stopThread(). Diese Methode setzt die interne Variable keepRunning auf false, was zum Abbruch der Schleife und zum Beenden der Methode führt.
-
Zitat von JohnFoo
public void run() {
while (keepRunning) {
System.out.println("Hello, World!");
}
naja mein problem is dass ich in dieser while() eine URLConnection hab, die sich mit einer url connected. wenn jedoch der download länger als 15 sec dauert will ich die connection abbrechen. und da genügt es ned die boolean variable auf false zu setzen. wollte es zuerst mit:Zitat
Properties prop = System.getProperties();
prop.put("sun.net.client.defaultConnectTimeout","1500");
prop.put("sun.net.client.defaultReadTimeout","1500");versuchen, jedoch funktioniert das ned. und daher hab ich mir gedacht dass ich einfach nen Thread mache den ich dann stoppe wenn 15sek vorbei sind. naja. das is also das eigentliche problem.
-
Thread.interrupt() unterbricht den Thread. Schau's dir in der Doku an.
Sollte das immer noch nicht helfen: Beschreibe dein Problem genau, sag was du machen willst und was du dir als Ergebnis erwartest. So müssen Helfer nicht ihre Zeit an Lösungen verschwenden, die ohnehin nicht gebraucht werden.
-
ok ich beschreibs genau:
also wir schreiben ein information retrieval system. der teil wo das problem ist, ist dafür zustandig, seiten aus dem internet downzuloaden. es wird natürlich nicht nur eine page abgerufen sondern mehrere parallel. wenn jedoch der server, auf welchem eine page ist überlastet is etc. kannn es sein dass der download einer seite mehrere minuten dauert und somit das ganze system warten lässt. aus diesem grund möchte ich ein timeout setzen, das den download nach ca 15sek abbricht und den leeren string statt den seiteninhalt liefert.
ich hab also eine Klasse A mit einer URLConnection. hier connecte ich mich mit einer seite mit dem befehl connection.connect(), was teilweise so lange dauert und lade den seiteninhalt in einen String, den ich mit einer getter() abrufen kann. Diese klasse A wird in einem Thread aufgerufen.
des weiteren hab ich die Klasse M. diese checkt ob ein thread noch alive() ist oder nicht. und M hat eine getter() die einen boolean liefert ob alive true oder false ist. M wird auch in einem Thread ausgeführt.
Zu guter letzt hab ich dann die Hauptklasse fuer diesen Teil. Hier starte ich zuerst den Thread mit A dann den Thread mit M. dann lasse ich den Thread mit M 15 sek sleepen und frage danach ab ob der Thread mit A noch alive ist. wenn ja dann dauert der URLAbruf zu lange und ich stoppe den Thread mit A mit threadA.stop(). und genau hier brauche ich diese threadAtop() methode für den Thread. danach stoppe ich auch noch den Thread mit M auch mit threadM.stop();
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!