2017-07-24 10 views
-1

Ich versuche, eine Aufgabe regelmäßig auszuführen. Beispiel:Timer kann Task nicht ausführen

class MyTimerTask implements TimerTask 
{ 
    public void run() { 
    // Some actions to perform 
    } 
    Timer cleaner = new Timer(true); 
    cleaner.scheduleAtFixedRate(new MyTimerTask(), 0, PURGE_INTERVAL); 
} 

Die Ausführungsmethode wird jedoch nur einmal ausgeführt. Aber wenn ich die erste Zeitverzögerung als 10 Sekunden setze, dann wird die run Methode nicht einmal ausgeführt.

Beispiel:

cleaner.scheduleAtFixedRate(new MyTimerTask(), 10, PURGE_INTERVAL); 

Antwort

0

Das klingt wie ein Problem mit Zeiteinheiten für mich. Stellen Sie sicher, dass Sie korrekt in Millisekunden konvertieren.

Der einfachste Weg, dies zu tun ist, Java TimeUnit zu verwenden.

Timer cleaner = new Timer(true); 
cleaner.scheduleAtFixedRate(new MyTimerTask(), 
    TimeUnit.SECONDS.toMillis(10), 
    TimeUnit.SECONDS.toMillis(30)); 

Es ist auch von der Timer gestartet im Daemon-Modus verursacht werden könnten. Wenn all Ihre Hauptmethode den Timer einrichtet und dann zurückgibt, wird der Timer nie ausgeführt, da es der letzte verbleibende Thread ist und weil es ein Daemon-Thread ist, wird die JVM beendet.

Um dies zu beheben, machen Sie den Timer-Thread nicht zu einem Daemon (d. H. Übergeben Sie false im Konstruktor) oder lassen Sie den Haupt-Thread vor dem Beenden auf Benutzereingaben warten.

Hier ist ein Beispiel sowohl die oben mit:

public class TimerDemo extends TimerTask { 

    public void run() { 
     System.out.printf("Time is now %s%n", LocalTime.now()); 
    } 

    public static void main(String[] args) throws IOException { 
     Timer timer = new Timer(true); 
     timer.scheduleAtFixedRate(new TimerDemo(), 
       TimeUnit.SECONDS.toMillis(5), 
       TimeUnit.SECONDS.toMillis(10)); 
     System.out.printf("Program started at %s%n", LocalTime.now()); 
     System.out.println("Press enter to exit"); 
     try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { 
      // Wait for user to press enter 
      reader.readLine(); 
     } 
     System.out.println("Bye!"); 
    } 
} 

Und Ausgabe, die es laufen:

Program started at 14:49:42.207 
Press enter to exit 
Time is now 14:49:46.800 
Time is now 14:49:56.799 
Time is now 14:50:06.799 
Time is now 14:50:16.799 
Time is now 14:50:26.799 
[I pressed 'enter'] 
Bye! 

Process finished with exit code 0 
+0

Ja, Sie haben Recht Raniz. Das Problem wurde nach dem Beenden der Hauptmethode die run-Methode nicht ausgeführt. Also, ich muss schlafen im Hauptthread. –

+0

Fühlen Sie sich frei, meine Antwort zu akzeptieren, wenn es das Problem für Sie gelöst hat. Es hilft anderen, indem diese Frage in den Suchergebnissen als gelöst angezeigt wird. – Raniz

0

Ich hatte eine harte Zeit genau herauszufinden, was dein Problem ist, so könnte dies nicht genau das, was Sie fordern, aber diese Lösung könnten Sie passen:

public class MyTimerTask implements Runnable { 
    private static final TimeUnit timeUnit = TimeUnit.SECONDS; 
    private final ScheduledExecutorService scheduler; 
    private final int period = 10; 
    public static void main(String[] args) { 
     new MyTimerTask(); 
    } 
    public MyTimerTask() { 
     scheduler = Executors.newScheduledThreadPool(1); 
     scheduler.scheduleAtFixedRate(this, period, period, timeUnit); 
    } 
    @Override 
    public void run() { 
     // This will run every 10 seconds 
     System.out.println("Ran..."); 
    } 
} 
+0

so eine fehlende @Override da war? – user7294900

+0

Nun, könnten Sie ein "funktionierendes" Beispiel aufstellen, weil der angegebene Code nicht ausgeführt werden kann, haben Sie Anweisungen in der Klassendeklaration usw. Ich glaube nicht, dass dies der Grund ist, da es einfach eine Annotation ist, um den Compiler zu geben bessere Hilfe. – Lurr