Methode abbrechen (Invoke von außen)

BRoll

Bekanntes Mitglied
Hi,

ich hänge gerade bei der Struktur für ein Projekt.
Das Problem ist, ich habe einen Aufbau mit vielen verschiedenen Klassen,
die sich an bestimmte Trigger-Events hängen können (wie gewöhnliche listener).
Jedoch soll es auch möglich sein, wenn manche Trigger ziehen, "unterbrochene" Methoden
von außen zu unterbrechen.

Hier mal ein kleines Beispiel:

Klasse 1: Hans
Klasse 2: Peter

Hans führt Methode laufen aus:
Java:
...
laufen (){
//jetzt passiert was
irgendwas.machwas(); // <= diese aktion kann irgendwo in anderen klassen trigger auslösen
// und jetzt noch viel mehr....
...
...
}

Dabei führt der Aufruf irgendwas.machwas() dazu, dass in Peter ein Listener anspringt.
Dieser könnte so aussehen:

...
wasPassiert(WerIstSchuld hans)
{
// jetzt bin ich peter erst mal dran
...
//der hans hat nix mehr zusagen
hans.stopAction();
}

Dabei soll jetzt hans.stopAction() die aktuelle Methode in der hans "steht" (weil er durch den trigger unterbrochen wurde) beenden, dh. hans ist fertig mit laufen und das programm läuft normal weiter.

Nur jetzt ist mir nicht klar wie man sowas umsetzen soll,
eine Lösung die geht aber ziemlich doof aussieht (besonders bei vielen aufrufen mit triggermöglichkeit in einer methode) wäre mit nem return:
Java:
boolean stop=false;
stopAction()
{
stop=true;
}
laufen (){
irgendwas.machwas();
if(stop)
{
return;
}
...
...
//nach jedem methodenaufruf muss das wieder rein!
}

Das kann ja auf keinen Fall eine gute Lösung sein!
Vielleicht kann man das auch geschickt mit Exceptions lösen,
damit hätte man wenigstens nur eine "abfrage":


Java:
laufen(){
try{
irgendwas.machwas();
...
...
irgenwas.machNochmalWas();
...
...
} catch(StopActionException e){
// do nothing, your action was cancelled
}
}
Dann muss natürlich jedes Trigger-Interface die StopActionException thrown können,
und anstatt hans.stopAction() muss der peter dann throw new StopActionException() aufrufen um den hans zu stoppen.


Übersehe ich hier was komplett, oder was habt ihr noch für Ideen?

Edit: Das Problem bei den exception ist, die sind anonym. ich kann damit immer nur den letzten ausführer stoppen, und nicht hans.stop() sagen. später kann es halt sein, dass nicht genau zu sagen ist wer die trigger methode aktiviert hat, und dann durch die exception "gekiillt" wird. ich brauche eher sowas, mit dem ich ein objekt tatsächlich "stop" sagen kann, und das bewirkt, falles es gerade irgendwo in einer methode ist, das diese nicht mehr weiter ausgeführt wird, sondern zum ende springt.
 
Zuletzt bearbeitet:

BRoll

Bekanntes Mitglied
Edit 2: Was mir jetzt noch eingefallen ist, ist mit Threads zu arbeiten. Das kann dann so aussehen:
Java:
 private Thread worker;
   
  public void machWas(Runnable runnable)
  {
  worker=new Thread(runnable);
  worker.start();
  
  try
  {
  worker.join();
  }
  catch (InterruptedException e)
  {
  e.printStackTrace();
  }
   
  }
   
  public void stop()
  {
  if(worker!=null)
  {
  if(worker.isAlive())
  {
  worker.stop();
  }
  }
  }

Das läuft auch gut, aber Thread.stop() ist ja deprecated. Es ist auch nicht wirklich schön, weil man, wenn eine aufgabe abgebrochen wird einfach
den Thread abschiesst. Aber was anderes ist doch auch garnicht möglich in Java? Wie soll man hier ohne Thread.stop() auskommen, eine andere Möglichkeit
hat man doch nicht um nach irgendeiner Zeile zu stoppen.
Bin bisschen ratlos was man in so einem Fall jetzt machen soll, keine der Lösungen gefällt mir wirklich.
Gibt es dazu vielleicht irgendein Designpattern oder was in die Richtung, mit dem man die Probleme garnicht erst bekommt?
Weil ich kann ja nur das Design ändern, wenn es keinen Code gibt der das Problem löst.
 

BRoll

Bekanntes Mitglied
Das bringt in dem Fall nichts. Thread.interrupt() bricht nicht den aktuellen Teil der Methode auf dem Stack ab.
Habs auch getestet :)
Meine Meinung bleibt, dass es keine weiteren Möglichkeiten gibt. In C hätte man gotos für sowas, aber in Java gibts das nicht.
Ich habe jetzt auch eine neue Architektur für solche Probleme ausgedacht. Diese basiert auf Exception, die aber nicht direkt anonym sind.
Dh. anstatt einfach methoden zu triggern löst man eine Nachfrage auf diese aus. Dabei kann dann eine Exception auftreten, dass die Aktion nicht durchgeführt werden kann, und man kann dann entsprechend reagieren. Anstatt also die Hans.laufen() abbrechen zu lassen, können einfach alle unterbrechbare Methoden die laufen() aufruft InterruptionExceptions schmeissen. Mein Problem ist jetzt denke ich auch gelöst dadurch, aber wer will kann ja hier noch ein bisschen über das Thema diskutieren. Jedenfalls ist die Lösung, alles in kleine atomare (also nicht unterbrechbare) aktionen aufzuteilen. Mit der Interruption löst man es, in dem man vor der Ausführung erst die Demands sammelt, diese auswertet und dann schaut ob man was machen muss.
 

Tom299

Bekanntes Mitglied
Java:
        // Test
        testThread = new Thread(new Runnable() {
            boolean interrupted = false;
           
            boolean checkInterrupted() {
                System.out.println("Check interrupted ...");
                try {
                    Thread.sleep(10);
                }
                catch (InterruptedException ie) {
                    System.out.println("interrupted");
                    interrupted = true;
                }
                return interrupted;
            }
           
            @Override
            public void run() {
                while (!checkInterrupted()) {
                    System.out.println("blabla");
                }
            }
        });
        testThread.start();

und später halt:
Java:
testThread.interrupt();

Wenn du jetzt den "Check" vor jeder neuen Methode aufrufst (ich hab das jetzt nur einmal am Anfang), dann kannst du nach jeder Methode abbrechen. Aber das hast du ja selbst bereits mit "Aufteilen in kleine aktionen" bemerkt.
 

BRoll

Bekanntes Mitglied
@Tom299
Naja wenn ich vor jedem Methoden aufruf check() aufrufen muss, dann habe ich ja nichts gewonnen.
Dann kann ich auch gleich if(stop) return; nach jedem aufruf hinschreiben.
Es geht ja genau darum, ohne den eigentlichen Code großartig zu verändern das zu erreichen.
Und das geht wie gesagt nur mit Exception oder Thread.stop() (oder Thread.suspend())
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Prüfen ob Methode ausgeführt wird und diese ggf. abbrechen? Allgemeine Java-Themen 8
N Methode abbrechen? Allgemeine Java-Themen 3
G Aufrufende Methode abbrechen Allgemeine Java-Themen 5
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
M Fabrik Methode, gutes Beispiel? Allgemeine Java-Themen 0
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
X Komponente an Methode übergeben Allgemeine Java-Themen 1
A Methode ergibt Java NullpointerException. Allgemeine Java-Themen 3
S Getestete Methode um das Beste aus URL-Nutzereingaben rauszuholen..? Allgemeine Java-Themen 4
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
M Methoden Methode Auslagern Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben