Eine andere Art von Aufgabenpool ist der geplante Aufgabenpool. Dem Namen nach zu urteilen, können wir davon ausgehen, dass wir diesen Typ verwenden, um zu planen, wann eine bestimmte Aufgabe gestartet werden soll.

Diese Art von Dienst ist nützlich, wenn wir die Aufgabe haben, eine Aktivität nach Ablauf einer gewissen Zeit zu starten, oder wenn wir eine wiederkehrende Aufgabe planen möchten.

Um eines zu verwenden, rufen wir Executors.newScheduledThreadPool(1) auf .

Über die Parameter sprechen wir etwas später. Was wir jedoch zunächst wissen müssen, ist, dass wir beim Aufruf dieser Methode ein ScheduledExecutorService- Objekt erhalten.

ScheduledExecutorService ist eine Schnittstelle, die ExecutorService erweitert .

Die folgenden Methoden werden in dieser Schnittstelle angezeigt:

Methode Erläuterung

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Erstellt und führt eine einmalige Aktion aus, die nach der angegebenen Verzögerung ausgeführt wird.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Erstellt und führt a ausGeplante ZukunftObjekt, das nach einer angegebenen Verzögerung ausgeführt wird.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Erstellt und führt eine wiederkehrende Aktion aus, die zuerst nach der angegebenen anfänglichen Verzögerung und dann erneut nach dem angegebenen Zeitraum ausgeführt wird. Mit anderen Worten, die Ausführung beginnt nach initialDelay , dann initialDelay + period , dann initialDelay + 2 * period usw.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Erstellt und führt eine wiederkehrende Aktion aus, die zuerst nach der angegebenen Anfangsverzögerung und dann noch einmal mit der angegebenen Verzögerung zwischen dem Abschluss einer Ausführung und dem Beginn der nächsten ausgeführt wird.

Über die Schnittstelle können wir also Aufgaben in regelmäßigen Abständen oder mit einer gewissen Verzögerung ausführen.

Mehr zur newScheduledThreadPool-Methode.

Wir können es auf verschiedene Arten nennen:


newScheduledThreadPool(int corePoolSize)
corePoolSize ist die Anzahl der Threads, die im Pool bleiben sollen, auch wenn sie inaktiv sind.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize ist die Anzahl der Threads, die im Pool bleiben sollen, auch wenn sie inaktiv sind.

threadFactory ist die Factory, die beim Erstellen neuer Threads verwendet wird.

Beide Methoden erstellen einen Thread-Pool, der Aktionen so planen kann, dass sie nach einer bestimmten Verzögerung oder in regelmäßigen Abständen ausgeführt werden.

Schauen wir uns ein Beispiel an, um zu sehen, wie ScheduledThreadPool funktioniert.

Angenommen, wir haben die Aufgabe, alle 5 Sekunden E-Mails zu überprüfen, diese Überprüfung darf sich jedoch nicht auf das Hauptprogramm auswirken und führt möglicherweise zum Verbrauch zusätzlicher Ressourcen.

Wir haben eine Aufgabenklasse, die das Abrufen von E-Mails simuliert.


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Checking email...");
   }
}

Als nächstes erstellen wir einen Thread-Pool und planen die Prüfung.


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

In der Ausgabe sehen wir alle 5 Sekunden:

E-Mails werden überprüft...

Im Allgemeinen können wir einen solchen Pool verwenden, um regelmäßige „Housekeeping“-Aufgaben durchzuführen, wie im Beispiel. Housekeeping-Aufgaben sind Aufgaben, die unabhängig von der Arbeit des Hauptprogramms ausgeführt werden müssen.