Methodenabbruch Problem

dapor

Mitglied
Hi,

ich habe eine Funktion gestartet, die irgendwas macht ...
jetzt möchte ich aber, wenn diese Funktion nach 3 Minuten keine andere aufgerufen hat, sie anhalten und unterbrechen ...
das Problem was ich habe ist, wie mache ich das?
Weil mithilfe eines Threads wird es schwer, weil ich ja nur einmal kurz die Methode aufrufe und dann mich um nichts mehr kümmere ... die Funktion ist ja aufgerufen und somit der Thread erledigt ... ich bekomme mithilfe eines anderen Threads heraus, wann die 3 Minuten um sind und habe nun versucht das Objekt einfach mithilfe von new Classname(); usw. zu beenden. Aber Java setzt scheinbar nur den internen "Pointer" dann um und die alte Methode läuft noch. Wie kann ich Java sagen, dass er damit aufhören soll? Selbst mit System.gc(); (also dem Garbage Collector) hatte ich kein Erfolg. Ich hatte die Hoffnung nachdem kein Objekt mehr draufzeigt ... dann mithilfe des GC alles zu beenden.

Ich danke für die Hilfe
 
Wenn du eine Methode start() hast die etwas tut, kannst du doch auch eine Methode stop() machen die die Aktion beendet wenn 3 Minuten nichts passiert ist, oder?
 
nicht so richtig ...

ich versuche grad für den nächsten Programmierwettbewerb in unserer Uni eine Art Hamster durch das Labyrinth zu programmieren.
Und nun ist es so, dass die Studenten die Hamster-KI programmieren sollen. Dazu schreiben sie ihre eigene Klasse mit einem bestimmten Interface. Und dieses Interface beinhaltet halt unter anderem die Methode/Funktion
Code:
public void run(HamsterPlayer hamsterPlayer)
.
Diese wird gestartet und nun kann der Spieler alles mögliche aus der hamsterPlayer Klasse aufrufen ...

Ich bekomme jetzt mit, wie lange es dauert bis wieder eine Methode ausgerufen wird ... aber ich kann die run-Methode nicht wieder einfach abbrechen. Habe versucht die Klasse des Hamster einfach neu zu initialisieren, aber die alte läuft noch weiter bis der Java Heap space erreicht ist ... und ich weiß nicht, wo mein Denkfehler ist.

falls der Spieler halt einen Zyklus entdeckt, dann soll er per StopButton z.B. auch abbrechen können.
Bitte helft mir. Ich danke euch ;)
 
Zuletzt bearbeitet:
das habe ich vorher auch mithilfe der Forumssuche gefunden, aber es ist nicht ganz das was ich suche bzw. verstehe ich was falsch.

Also es ist doch so, dass ich nicht weiß was die Studenten in ihrer run(hamster)-Methode, die sie implementieren, genau machen. Deshalb habe ich auch nur einen Thread, der die run-Methode aufruft. Nachdem die Methode doch nun aufrufen ist, ist der Thread auch schon nicht mehr alive. Wie schaffe ich es trotzdem, dass diese Methode oder einfach die ganze Klasse gekillt wird?
Ich habe mir gedacht ... da die Studenten nur die Methoden der HamsterPlayer Klasse aufrufen können ... könnte man vielleicht da was machen ... aber irgendwie müsste ich halt einfach eine Klasse "killen" können, dann wär alles so einfach.
Gibt es da keine Möglichkeit?
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 */
public class RunnableWithTimeOutExample {

  /**
   * @param args
   */
  public static void main(String[] args) {

    Runnable runnable = new Runnable() {
      public void run() {
        doSomething();
      }


      private void doSomething() {
        try {
          TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    };

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    executorService.execute(new DelegatingRunnableWithTimeOutSupport(runnable, 
      3
      //10
      ));
    executorService.shutdown();
  }

  static class DelegatingRunnableWithTimeOutSupport implements Runnable {

    Runnable delegate;
    long timeOutInSeconds;


    public DelegatingRunnableWithTimeOutSupport(Runnable delegate, long timeOutInSeconds) {
      super();
      this.delegate = delegate;
      this.timeOutInSeconds = timeOutInSeconds;
    }


    public void run() {
      ExecutorService executorService = Executors.newSingleThreadExecutor();
      System.out.println("Start new Thread");
      try {
        System.out.println("Run delegate task...");
        executorService.execute(delegate);
        executorService.awaitTermination(timeOutInSeconds, TimeUnit.SECONDS);
        System.out.println("finished usertask");
        executorService.shutdownNow();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

Gruß Tom
 
Ich habe es jetzt ganz einfach gemacht ... (warum ich davor nicht drauf gekommen bin ... weiß ich nicht ...)
Ich fange meinen run(hamster)-Methodenaufruf einfach mithilfe eines try-catch Blockes ab und setze eine bestimmt Klasse auf NULL, wenn er gestoppt werden soll. Dann fange ich jede Methode, die der Hamster aufrufen kann ab und schaue ob überhaupt die eine bestimmt Klasse != NULL ist. Falls nicht, dann wirft er halt die Exception, die ich abfange.

Ich danke aber erstmal Thomas. Das Beispiel was du mir gegeben hast, kann ich zwar hier beim Hamster nicht benutzen aber ich brauche es schon an einer anderen Stelle.
Auch flashray möchte ich danken. auch wenn wir glaube ich etwas aneinander vorbeigesprochen haben bzw. ich das Problem falsch formuliert habe. ;)
 
Zurück