2017-10-19 8 views
0

Ich habe das folgende Problem: Ich schreibe einen Chat-Bot in Java und ich möchte eine Methode sogar x Minuten aufrufen. Also ich lese ein "Timer.Schedule" ist was ich brauche. Also schreibe ich die folgende Methode:Java Timer.Schedule (Infiniti-Loop) stoppe laufen

public function timerMethod() 
{ 
    int time = 10; 

    ... 

    new java.util.Timer().schedule(
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       timerMethod(); 
      } 
     }, 1000 * 60 * time // 1MSec * 1Sec * xMin 
    ); 
} 

Zu Beginn der Schleife funktioniert gut, aber nach ein paar Stunden (ich glaube, es ist nach 10-15 Stunden) die Schleife arbeiten nicht mehr ... Ich weiß nicht, warum ich nicht funktionieren und nicht verantwortlich jede mögliche Fehlermeldung :(

Kann mir jemand helfen ??? pleace

+0

Ist es möglich, dass eine Ausnahme in 'timerMethod()' geworfen wird? Versuchen Sie, den Anruf mit "Versuch" 'fangen' zu umgeben und irgendwelche Details der Ausnahme zu notieren, die geworfen wird, um diese Möglichkeit zu beseitigen, –

+0

ich versuche, aber keine Ausnahme ... die Terminalanzeige keine Störung oder Ausnahme ... – padhie

Antwort

0

so um Code für x Minuten laufen, richtig?

Wenn ja, konvertieren Sie die gewünschte Zeit der Code, für den in Millisekunden wie folgt ausgeführt wird: 1 Minute = 60000 ms. Es gibt eine Methode namens System.currentTimeMillis(), die einen Wert von Millisekunden ab dem EPOCH-Datum (1. Januar 1970) zurückgibt.

Sie können eine while-Schleife wie folgt verwenden:

`

int msTime = 60000; //1 Minute = 60000 MS 
int doUntil = ms + System.currentTimeMillis(); //1 minute 
while(System.currentTimeMillis() != doUntil) 
{ 
    //Code here 
    System.out.println(¨Hello World¨); //This will print Ḧello World for 60000ms 

} 
+0

meinen Sie dieser Code anstelle meines Timers(). Schedule()? – padhie

0

Mmm gut Zuerst kann man mehrere Male die java.util.Timer() Variable stoppen instanziieren. Sie benötigen nur einen als Attribut der Klasse. Die TimerTask ist die einzige, die neu installiert werden sollte.

private Timer timer = new Timer(); 

Nun umgeben Ihr Code innerhalb der Lauffunktion mit try/catch:

  public void run() { 
      try { 
       timerMethod(); 
      } catch(InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

Sie, dass timerMethod nur einmal nennend? Sie können diesem Code auch einige Ausdrucke hinzufügen, um zu überprüfen, wann Sie Ihre Funktion neu planen und wann Sie Ihre Methode ausführen.

+0

Try/Catch Ich habe versucht, aber keine Ausnahme oder Fehler ... Ich habe 3 andere Timer, kann ich das gleiche Timer-Objekt verwenden oder muss ich für jeden Timer ein eigenes Objekt tun? – padhie