Ich habe einige Codes ausprobiert, um eine geplante Aufgabe zu implementieren, und mir diese Codes ausgedacht.
import java.util.*;
class Task extends TimerTask {
int count = 1;
// run is a abstract method that defines task performed at scheduled time.
public void run() {
System.out.println(count+" : Mahendra Singh");
count++;
}
}
class TaskScheduling {
public static void main(String[] args) {
Timer timer = new Timer();
// Schedule to run after every 3 second(3000 millisecond)
timer.schedule( new Task(), 3000);
}
}
Meine Ausgabe:
1 : Mahendra Singh
Ich hatte erwartet, dass der Compiler eine Reihe von Mahendra Singh in regelmäßigen Abständen von 3 s druckt, aber obwohl ich ungefähr 15 Minuten gewartet habe, erhalte ich nur eine Ausgabe ... Wie löse ich das?
Timer
.Antworten:
Verwenden
timer.scheduleAtFixedRate
public void scheduleAtFixedRate(TimerTask task, long delay, long period)
Plant die angegebene Aufgabe für die wiederholte Ausführung mit fester Rate, beginnend nach der angegebenen Verzögerung. Nachfolgende Ausführungen finden in ungefähr regelmäßigen Abständen statt, getrennt durch den angegebenen Zeitraum.
Bei der Ausführung mit fester Rate wird jede Ausführung relativ zur geplanten Ausführungszeit der anfänglichen Ausführung geplant. Wenn eine Ausführung aus irgendeinem Grund verzögert wird (z. B. durch Speicherbereinigung oder andere Hintergrundaktivitäten), werden zwei oder mehr Ausführungen schnell hintereinander ausgeführt, um "aufzuholen". Auf lange Sicht ist die Häufigkeit der Ausführung genau der Kehrwert des angegebenen Zeitraums (vorausgesetzt, die Systemuhr, die Object.wait (long) zugrunde liegt, ist korrekt).
Die Ausführung mit fester Rate eignet sich für wiederkehrende Aktivitäten, die von der absoluten Zeit abhängig sind, z. B. das stündliche Klingeln eines Glockenspiels oder das tägliche Ausführen geplanter Wartungsarbeiten zu einer bestimmten Zeit. Es ist auch für wiederkehrende Aktivitäten geeignet, bei denen die Gesamtzeit für die Ausführung einer festen Anzahl von Ausführungen wichtig ist, z. B. ein Countdown-Timer, der zehn Sekunden lang einmal pro Sekunde tickt. Schließlich ist die Ausführung mit fester Rate geeignet, um mehrere sich wiederholende Zeitgeberaufgaben zu planen, die in Bezug zueinander synchronisiert bleiben müssen.
Parameter:
Würfe:
quelle
Vorteil von
ScheduledExecutorService
überTimer
Ich möchte Ihnen eine Alternative zur
Timer
Verwendung von ScheduledThreadPoolExecutor anbieten , einer Implementierung der ScheduledExecutorService- Schnittstelle. Laut "Java in Concurrency" hat es einige Vorteile gegenüber der Timer-Klasse:Ein weiteres Problem mit Timer ist, dass es sich schlecht verhält, wenn a
TimerTask
eine ungeprüfte Ausnahme auslöst . Wird auch als "Fadenleckage" bezeichnet.Eine weitere Empfehlung: Wenn Sie Ihren eigenen Planungsdienst erstellen müssen, können Sie die Bibliothek möglicherweise weiterhin nutzen, indem Sie
DelayQueue
eineBlockingQueue
Implementierung verwenden, die die Planungsfunktionalität von bereitstelltScheduledThreadPoolExecutor
. ADelayQueue
verwaltet eine Sammlung verzögerter Objekte. Mit einer Verzögerung ist eine Verzögerungszeit verbunden: Mit dieserDelayQueue
Option können Sie ein Element nur dann übernehmen, wenn seine Verzögerung abgelaufen ist. Objekte werden nachDelayQueue
der mit ihrer Verzögerung verbundenen Zeit von einer Bestellung zurückgegeben.quelle
public void schedule(TimerTask task,long delay)
Plant die angegebene Aufgabe für die Ausführung nach der angegebenen Verzögerung.
Sie wollen:
public void schedule(TimerTask task, long delay, long period)
Plant die angegebene Aufgabe für die wiederholte Ausführung mit fester Verzögerung , beginnend nach der angegebenen Verzögerung. Nachfolgende Ausführungen finden in ungefähr regelmäßigen Abständen statt, die durch den angegebenen Zeitraum getrennt sind.
quelle
timer.scheduleAtFixedRate( new Task(), 1000,3000);
quelle