# Methode abbrechen?



## Novanic (15. Nov 2007)

Hi Leute,

ich möchte eine Methode nach einer bestimmten Zeit abbrechen, da es sein könnte dass sie hängen geblieben ist. Das Problem ist, ich kann/darf die Methode nicht verändern, sondern sehe praktisch nur den Methodenaufruf und die abstrakte Oberklasse und Obermethode (super), die ich verändern könnte.

Eine Idee wäre die Methode in einem zweiten Thread aufzurufen und diesen dann nach einer bestimmten Zeit mit "stop()" abzubrechen, was aber wohl nicht so schön wäre. Ich weiß zwar das in der aufzurufenden Methode nicht auf Laufwerke zugegriffen wird (keine Deadlocks möglich), aber wie sieht dass dann mit den Objekten aus, die von der Methode erzeugt wurden? Werdenm die sauber vom GarbageCollector abgeräumt?

Dass die Obermethode nach einer bestimmten Zeit eine art Timeout-Exception schmeißt wäre nicht möglich oder?

Fällt euch was gutes dazu ein? 

Danke schonmal im Voraus! 

Gruß Nova


----------



## SlaterB (15. Nov 2007)

es gibt keine Methoden, die von selber herumlaufen,
es ist immer ein Thread der irgendwelche Arbeit ausführt,

eine Methode kann nicht hängen, Objekte können nicht sauber oder unsauber sein,
in Java gibts keine undefinierten oder sonst wie seltsamen Zustände (soweit ich weiß  )

wenn ein Thread blockiert (synchronized Deadlock, Stream-Lesen (Benutzereingabe, Netzwerk) usw),
gut dann wartet der Thread, und dessen Objekte werden nicht gelöscht, richtig

wenn er beendet wird, dann sind die Objekte frei (sofern nicht woanders bekannt), alles ganz normal,

Timeout oder irgendeine Art von Modifikation der Schritt für Schritt-Abarbeitung gibts genauso wenig (soweit ich weiß  ),
musst du alles mit Threads nachbauen, wenn gewünscht


----------



## André Uhres (15. Nov 2007)

Ja, man kann eine Methode nicht abbrechen. Du könntest höchstens vor dem Methodenaufruf einen Timer starten, der dich darüber informiert, wenn eine gewisse Zeit abgelaufen ist und die Methode immer noch nicht fertig ist.
Im zutreffenden Fall bleibt dir wohl nur noch ein Neustart der Anwendung übrig.


----------



## Novanic (15. Nov 2007)

Ok, also mal angenommen das was ich aufrufen möchte sieht so aus:


```
public class TestKlasse extends AbstractTestOut
    {
        private Collection myCollection = new ArrayList(5000);

        public void meineUnsichtbareMethode() {
            super.meineUnsichtbareMethode();
            while(true) {
                System.out.println("Endlosschleife...");
                myCollection.add(new String[]{"a", "b", "c"});
            }
        }
    }
```

Mein Thread bzw. der Aufruf sieht dann so aus:


```
new Thread(new Runnable() {
        public void run() {
            new TestKlasse().meineUnsichtbareMethode();
        }
    }).start();
```

Wenn ich den Thread dann nach einer bestimmten Zeit mit "stop()" beende, wird der Thread, das Objekt der TestKlasse und myCollection komplett vom GarbageCollector abgeräumt? Oder pausiert der Thread dann nur so zu sagen und wartet auf "resume()" oder so?

Und könnte es irgendwelche anderen Probleme auslösen, wenn ich die Methode auf diese Weise beende? Spätestens wohl wenn in der Methode Datenbank-Zugriffe ausgeführt werden oder?

Gruß Nova


----------

