Timer bauen, Main Methode immer wieder neu starten

javadau2018

Mitglied
Guten Morgen,
bei mir schlägt mal wieder meine Unwissenheit zu.
Ich baue momentan an einem Timer, der ein Programm alle 5 Min. neu starten lassen soll. Das Ganze soll als Systemdienstprogramm laufen.
Es muss also immer wieder die Main Methode initialisieren werden. Folgendes habe ich mir schon zusammen gebaut/gesucht.
In der Hauptdatei wird folgender Aufruf gestartet
Java:
public static void TimerReloaded (String timerTask[], String args) throws IOException {
      
        TimerReloaded.Timer(timerTask);
    }
Und dann kommt in der TimerReloaded folgender Aufruf:
Java:
import java.util.Timer;
import java.util.TimerTask;
import java.util.*;

    public class TimerReloaded {
       public static void Timer(String[] timerTask, String args) {
          // creating timer task, timer
          TimerTask timerrun = new Timer();
          Timer timer = new Timer();
        
          // scheduling the task at interval
          timer.schedule(timerrun,5000, 5000);    
       }
       // this method performs the task
       public void run() {
         
          System.out.println("timer working");    
       }  
    }

Diesen Code habe ich hier aus dem Forum. Leider habe ich logischer Weise den selben Fehler, aber es wurde leider nicht berichtet, ob und wie der Fehler behoben wurde.... Und ich selber erkenne den Fehler leider nicht.

ist das Überhaupt der richtige Weg, bzw. gibt es vllt. einen der noch eleganter/ besser geeigent ist?

Vielen Dank für eure Hilfe!
 
Java:
TimerTask timerrun = new Timer();
  • Timer ist kein TimerTask.
  • Dein TimerTask benötigt den run. Aktuell hast du run aber nur für TimerReloaded.
  • Warum ist der ArrayParameter vom Typ String? Du verwendest das Array auch garnicht.
  • Bitte schreibe Methodennamen klein, das verwirrt total mit den Klassennamen
  • Dein Timer-Aufruf hat 1 Parameter, deine Methode 2
Am Ende muss es also etwa so aussehen:

Java:
package javaforum.org.examples;

import java.util.TimerTask;
import java.util.Timer;

public class TimerReloaded {
    public static void setTimer(TimerTask[] tasks) {
       Timer timer = new Timer();
   
       for(TimerTask task : tasks) {
           timer.schedule(task, 1000, 1000);
       } 
    }
 
    public static void main(String[] args) {
        TimerTask task1 = new TimerTask() {
            @Override
            public void run() {
               System.out.println("Timer1 working"); 
            }
        };
     
        TimerTask task2 = new TimerTask() {
            @Override
            public void run() {
               System.out.println("Timer2 working"); 
            }
        };
     
        TimerTask[] tasks= {task1, task2};
     
        setTimer(tasks);
    }
 }
 
Vielen Dank für deine Mühe!!!
Aber ich bekomme überhaupt keine Ausgabe... noch nicht mal wenn ich das Ganze Stand-Alone mache...
Ich habe auch mal das hier ausprobiert:
Java:
        public static void main(String[] args) {
            Timer timer = new Timer ();
            timer.scheduleAtFixedRate (new TimerTask() {
               
                @Override
        public void run() {
                    System.out.println("Hello");
                }
            }, 1000, 2*1000);
           
        }

Aber selbst da gibt mir Eclipse kein sysout....
 
Sorry das kann ich nicht nachvollziehen, dein Standalone Test sieht soweit gut aus.

Hast du versucht Eclipse mal neuzustarten. Eventuell hast du noch irgendwelche alten Runnings offen (ggf.siehst du in der Console auch das rote Viereck und es reicht ein Klick darauf), mit denen du dich überschneidest. Das kann schon mal vorkommen, wenn man zuvor fehlerhafte Timer laufen hatte.
 
Ja habe ich ausprobiert.... Leider tut sich aber immer noch nichts....

Die Stopptaste ist auch nicht aktiv.

Wirklich seltsam. Da bin ich mal gespannt wie ich das Problem lösen soll, wenn ich gar nicht sehe was das Programm macht...
 
So, ich bin jetzt mal hergegangen und habe eine neue Workbench aufgemacht und siehe da es funktioniert......
Nun wieder zurück zum eigentlich Problem. Wenn ich jetzt statt "timer1", die Main Methode in einem bestimmten class ausgeben möchte, so das dann das Ganze Programm wieder von vorne anfängt, wie mache ich das am besten?
 
Eventuell hattest du ein anderes main gestartet, nicht deinen Test. Egal...

Ich baue momentan an einem Timer, der ein Programm alle 5 Min. neu starten lassen soll. Das Ganze soll als Systemdienstprogramm laufen

Das klingt eigentlich danach, dass du keinen Java Timer brauchst. Gehe mal in die "Aufgabenplanung" von Windows. Du kannst dort eine neue Aufgabe erstellen mit einem 5min Trigger und ein Java Programm starten lassen. Du hast also dann nur diese eine main, welche von Windows und nicht von einem anderen Java Programm angesteuert wird.

Ansonsten ist main eine statische Methode, ich gehe mal davon aus, dass du diese genauso aufrufen kannst wie jede andere statische Methode (habs noch nie probiert)
 
Die Aufgabeplanung kann ich dafür leider nicht benutzen, da das Ganze hinterher auf einen Server laufen soll, und so wie ich verstanden habe unter Tomcat. Also nichts mit Windows....
 
Die Aufgabeplanung kann ich dafür leider nicht benutzen, da das Ganze hinterher auf einen Server laufen soll, und so wie ich verstanden habe unter Tomcat. Also nichts mit Windows....
Wenn das im EE-Umfeld läuft, hat das noch mal ganz andere Anforderung.
Ne main über die gestartet wird, gibts dann z.B. gar nicht, von daher solltest du dir erst einmal deine Anforderungen klar machen.
 
Guten Morgen,

ich habe mir deinen Rat zu Herzen genommen und habe mir meinen Code nochmal zur Brust genommen. Nun meine Frage: ich habe folgenden Code:
Java:
private static void loadfiles(String verzName, String verzNameDes, String verzLogFile)

Wie bringe ich Java dazu diese Methode alle 5 Min neu zu starten?

Java:
public static String Timer (String loadfiles) {
        try {
            Thread.sleep(5000);
            } catch(InterruptedException ex) {
              Thread.currentThread().interrupt();
                }
        return loadfiles;

    }
So habe ich es probiert, dass hatte aber leider nicht den gewünschten Erfolg.
 
Zuletzt bearbeitet:
Habe es geschafft.
Java:
try {
            Thread.sleep(iwait);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        initprog();
    }

Manchmal sieht man den Wald vor lauter Bäumen nicht.....
 
Thread.sleep ist alles andere als ein Ersatz für nen Timer...

Am ehesten würde man dafür ScheduledExecutorService nutzen, das Javadoc enthält auch wie.
 

Zurück
Oben