ExecutorService-Schnittstelle
Eine java.util.concurrent.ExecutorService-Schnittstelle ist eine Unterschnittstelle der Executor-Schnittstelle und fügt Funktionen zum Verwalten des Lebenszyklus sowohl der einzelnen Aufgaben als auch des Executors selbst hinzu.
ExecutorService-Methoden
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | boolean awaitTermination(long timeout, TimeUnit unit) Blockiert, bis alle Aufgaben nach einer Anforderung zum Herunterfahren ausgeführt wurden oder das Zeitlimit auftritt oder der aktuelle Thread unterbrochen wird, je nachdem, was zuerst eintritt. |
2 | <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) Führt die angegebenen Aufgaben aus und gibt eine Liste der Futures zurück, die ihren Status und ihre Ergebnisse enthalten, wenn alle abgeschlossen sind. |
3 | <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) Führt die angegebenen Aufgaben aus und gibt eine Liste der Futures zurück, die ihren Status und ihre Ergebnisse enthalten, wenn alle abgeschlossen sind oder das Timeout abläuft, je nachdem, was zuerst eintritt. |
4 | <T> T invokeAny(Collection<? extends Callable<T>> tasks) Führt die angegebenen Aufgaben aus und gibt gegebenenfalls das Ergebnis einer erfolgreich abgeschlossenen Aufgabe zurück (dh ohne eine Ausnahme auszulösen). |
5 | <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) Führt die angegebenen Aufgaben aus und gibt das Ergebnis einer Aufgabe zurück, die erfolgreich abgeschlossen wurde (dh ohne eine Ausnahme auszulösen), falls dies vor Ablauf des angegebenen Zeitlimits der Fall ist. |
6 | boolean isShutdown() Gibt true zurück, wenn dieser Executor heruntergefahren wurde. |
7 | boolean isTerminated() Gibt true zurück, wenn alle Aufgaben nach dem Herunterfahren abgeschlossen wurden. |
8 | void shutdown() Initiiert ein ordnungsgemäßes Herunterfahren, bei dem zuvor übermittelte Aufgaben ausgeführt werden, aber keine neuen Aufgaben akzeptiert werden. |
9 | List<Runnable> shutdownNow() Es wird versucht, alle aktiv ausgeführten Aufgaben zu stoppen, die Verarbeitung wartender Aufgaben anzuhalten und eine Liste der Aufgaben zurückzugeben, die auf die Ausführung gewartet haben. |
10 | <T> Future<T> submit(Callable<T> task) Sendet eine wertrückgebende Aufgabe zur Ausführung und gibt eine Zukunft zurück, die die ausstehenden Ergebnisse der Aufgabe darstellt. |
11 | Future<?> submit(Runnable task) Sendet eine ausführbare Aufgabe zur Ausführung und gibt eine Zukunft zurück, die diese Aufgabe darstellt. |
12 | <T> Future<T> submit(Runnable task, T result) Sendet eine ausführbare Aufgabe zur Ausführung und gibt eine Zukunft zurück, die diese Aufgabe darstellt. |
Beispiel
Das folgende TestThread-Programm zeigt die Verwendung der ExecutorService-Schnittstelle in einer threadbasierten Umgebung.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
executor.submit(new Task());
System.out.println("Shutdown executor");
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
System.err.println("tasks interrupted");
} finally {
if (!executor.isTerminated()) {
System.err.println("cancel non-finished tasks");
}
executor.shutdownNow();
System.out.println("shutdown finished");
}
}
static class Task implements Runnable {
public void run() {
try {
Long duration = (long) (Math.random() * 20);
System.out.println("Running Task!");
TimeUnit.SECONDS.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Dies führt zu folgendem Ergebnis.
Ausgabe
Shutdown executor
Running Task!
shutdown finished
cancel non-finished tasks
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:302)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:328)
at TestThread$Task.run(TestThread.java:39)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)