1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

timeout Thread?

  • deSertXtall
  • 24. November 2004 um 19:35
  • Unerledigt
  • deSertXtall
    4
    deSertXtall
    Mitglied
    Punkte
    140
    Beiträge
    22
    • 24. November 2004 um 19:35
    • #1

    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?

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 24. November 2004 um 21:08
    • #2

    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:

    Zitat

    A task that can be scheduled for one-time or repeated execution by a Timer.


    Klingt gut.

  • Zentor
    16
    Zentor
    Mitglied
    Reaktionen
    5
    Punkte
    2.710
    Beiträge
    506
    • 25. November 2004 um 10:11
    • #3

    Mach 2 Threads, einer überwacht den anderen.
    mfg Oliver

  • deSertXtall
    4
    deSertXtall
    Mitglied
    Punkte
    140
    Beiträge
    22
    • 25. November 2004 um 11:26
    • #4
    Zitat von Zentor

    Mach 2 Threads, einer überwacht den anderen.
    mfg Oliver

    Danke. so hab ichs gemacht und so funzt es! :p

    gibts eigentlich auch ne andere möglichkeit einen Thread zu stoppen ausser mit der stop()? hab version 1.4.2.

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 25. November 2004 um 13:55
    • #5
    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.

  • Zentor
    16
    Zentor
    Mitglied
    Reaktionen
    5
    Punkte
    2.710
    Beiträge
    506
    • 25. November 2004 um 15:24
    • #6

    Mach deine eigene stopNow() methode, welche dazu führt, das run() returned. Dieses stopNow wird von dem anderen Thread aufgerufen.
    mfg Oliver

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 25. November 2004 um 16:32
    • #7
    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. :grinning_squinting_face:

  • deSertXtall
    4
    deSertXtall
    Mitglied
    Punkte
    140
    Beiträge
    22
    • 27. November 2004 um 15:36
    • #8

    wie? eine methode welche eine methode retourniert? versteh ich ned...

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 27. November 2004 um 17:35
    • #9

    Der überwachte Thread:

    Code
    public class MyObservedThread extends Thread {
    
    
        private boolean keepRunning = true;
    
    
        public void run() {
            while (keepRunning) {
                System.out.println("Hello, World!");
            }
        }
    
    
        public void stopThread() {
            keepRunning = false;
        }
    }
    Alles anzeigen


    Der überwachende Thread:

    Code
    public 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();
            }
        }
    }
    Alles anzeigen

    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.

  • deSertXtall
    4
    deSertXtall
    Mitglied
    Punkte
    140
    Beiträge
    22
    • 28. November 2004 um 00:05
    • #10
    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.

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 28. November 2004 um 01:03
    • #11

    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.

  • deSertXtall
    4
    deSertXtall
    Mitglied
    Punkte
    140
    Beiträge
    22
    • 28. November 2004 um 11:08
    • #12

    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();

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung