logo

Java ExecutorService

Der Java ExecutorService ist die Schnittstelle, die es uns ermöglicht, Aufgaben auf Threads asynchron auszuführen. Die Java ExecutorService-Schnittstelle ist im Paket java.util.concurrent vorhanden. Der ExecutorService hilft bei der Verwaltung eines Thread-Pools und weist ihnen Aufgaben zu. Es bietet auch die Möglichkeit, Aufgaben in die Warteschlange zu stellen, bis ein freier Thread verfügbar ist, wenn die Anzahl der Aufgaben größer ist als die verfügbaren Threads.

Java ExecutorService

Methoden von Java ExecutorService

Methode Beschreibung
boolescher Wert „awaitTermination“ (lange Zeitüberschreitung, TimeUnit-Einheit) Diese Methode blockiert die Eingabe von ExecutorService durch die Aufgabe, bis alle Aufgaben nach der Anforderung zum Herunterfahren abgeschlossen sind, die angegebene Zeitüberschreitung eintritt oder der aktuelle Thread unterbrochen wird, je nachdem, was zuerst eintritt.
AufführeninvokeAll(CollectionAufgaben) Diese Methode führt die Liste der angegebenen Aufgaben aus und gibt die Liste der Futures zurück, die die Ergebnisse aller Aufgaben nach Abschluss enthält.
AufführeninvokeAll(CollectionAufgaben, langes Timeout, TimeUnit-Einheit) Diese Methode führt die Liste der angegebenen Aufgaben aus und gibt die Liste der Futures zurück, die die Ergebnisse aller Aufgaben enthalten, wenn diese abgeschlossen sind oder die Zeitüberschreitung abläuft, je nachdem, was zuerst eintritt.
T invokeAny(CollectionAufgaben) Diese Methode führt die Liste der angegebenen Aufgaben aus und gibt das Ergebnis einer Aufgabe zurück, die ohne Auslösen einer Ausnahme abgeschlossen wird.
T invokeAny(CollectionAufgaben, langes Timeout, TimeUnit-Einheit) Diese Methode führt die Liste der angegebenen Aufgaben aus und gibt das Ergebnis einer Aufgabe zurück, die vor Ablauf des Timeouts ohne Auslösen einer Ausnahme abgeschlossen wird.
boolean isShutdown() Diese Methode gibt zurück, ob der angegebene Executor heruntergefahren ist oder nicht.
boolean isTerminated() Diese Methode gibt „true“ zurück, wenn alle Aufgaben nach dem Herunterfahren ausgeführt wurden.
void Shutdown() Diese Methode ermöglicht den Abschluss zuvor an den ExecutorService übermittelter Aufgaben und erlaubt nicht die Annahme anderer Aufgaben.
ShutdownNow() auflisten Diese Methode stoppt alle aktiv ausgeführten Aufgaben, stoppt die Ausführung von Aufgaben in der Warteschlange und gibt die Liste der Aufgaben in der Warteschlange zurück.
Zukünftige Übermittlung (aufrufbare Aufgabe) Diese Methode sendet eine einen Wert zurückgebende Aufgabe zur Ausführung und gibt die Zukunft zurück, die das ausstehende Ergebnis der Aufgabe darstellt.
Zukünftige Übermittlung (ausführbare Aufgabe) Diese Methode sendet eine Aufgabe zur Ausführung und gibt einen Future zurück, der diese Aufgabe darstellt. Bei erfolgreichem Abschluss wird null zurückgegeben.
Zukünftige Einreichung (ausführbare Aufgabe, T-Ergebnis) Diese Methode sendet eine Aufgabe zur Ausführung und gibt einen Future zurück, der diese Aufgabe darstellt.

Ein einfaches Programm von Java ExecutorService

 public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } } 

Ausgabe:

Java ExecutorService

In diesem Programm erstellen wir einen ExecutorService mit zehn Threads und weisen ihm eine anonyme ausführbare Implementierung zu, die eine Aufgabe zum Drucken von „ExecutorService“ ausführt. Nachdem die Aufgabe beendet ist, fahren wir den Executor-Dienst herunter.

Entwurfsmuster für die Fabrikmethode

So verwenden Sie Java ExecutorService

ExecutorService wird instanziiert

Wir können Java ExecutorService verwenden, um einen einzelnen Thread, einen Thread-Pool oder einen geplanten Thread-Pool zu erstellen. Die Executors-Klasse stellt Factory-Methoden zum Instanziieren eines ExecutorService wie folgt bereit:

 ExecutorService executorService1 = Executors.newSingleThreadExecutor(); //Creates //a ExecutorService object having a single thread. ExecutorService executorService2 = Executors.newFixedThreadPool(10); // Creates a //ExecutorService object having a pool of 10 threads. ExecutorService executorService3 = Executors.newScheduledThreadPool(10); //Creates a scheduled thread pool executor with 10 threads. In scheduled thread //pool, we can schedule tasks of the threads. 

Aufgaben an ExecutorServices zuweisen

Um ExecutorService eine Aufgabe zuzuweisen, können wir die folgenden Methoden verwenden:

  • ausführen(Ausführbare Aufgabe)
  • einreichen(Ausführbare Aufgabe) / einreichen(Aufrufbare Aufgabe)
  • invokeAny(CollectionAufgaben)
  • invokeAll(CollectionAufgaben)

Beispiel für die Zuweisung einer Aufgabe an ExecutorService mithilfe der Methodeexecute()

Die Methodeexecute() des Java ExecutorService nimmt ein ausführbares Objekt auf und führt seine Aufgabe asynchron aus. Nachdem wir die Methode „execute“ aufgerufen haben, rufen wir die Methode „shutdown“ auf, die verhindert, dass sich andere Aufgaben im executorService in die Warteschlange stellen.

 public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } } 

Ausgabe:

Java-Main
 ExecutorService 

Beispiel für die Zuweisung einer Aufgabe an ExecutorService mithilfe von subscribe()

Die Methode „submit()“ nimmt ein ausführbares Objekt auf und gibt ein Future-Objekt zurück. Dieses Objekt wird später verwendet, um den Status von Runnable zu überprüfen, ob die Ausführung abgeschlossen ist oder nicht.

 public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); } } 

Beispiel für die Zuweisung einer Aufgabe an ExecutorService mithilfe der invokeAny()-Methode

Die Methode invokeAny() nimmt eine Sammlung von Callable-Objekten oder Objekten von Klassen, die Callable implementieren. Diese Methode gibt das zukünftige Objekt des aufrufbaren Objekts zurück, das zuerst erfolgreich ausgeführt wird.

 public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 1&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 2&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 3&apos;; } }); String result = executorService.invokeAny(callables); System.out.println(&apos;result = &apos; + result); executorService.shutdown(); } } </callable></callable>

Ausgabe:

 result = Task 1 

Das Ergebnis speichert Aufgabe 1, da das erste aufrufbare Objekt zuerst erfolgreich ausgeführt wird.

Beispiel für die Zuweisung einer Aufgabe an ExecutorService mithilfe der invokeAll()-Methode

Die Methode invokeAll() nimmt eine Sammlung aufrufbarer Objekte mit Aufgaben auf und gibt eine Liste zukünftiger Objekte zurück, die das Ergebnis aller Aufgaben enthält.

 public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 1&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 2&apos;; } }); callables.add(new Callable() { public String call() throws Exception { return &apos;Task 3&apos;; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println(&apos;future.get = &apos; + future.get()); } executorService.shutdown(); } } </future></callable></callable>

Ausgabe:

 future.get = Task 1 future.get = Task 3 future.get = Task 2 

So fahren Sie ExecutorService herunter

Sobald wir mit unseren an ExecutorService übergebenen Aufgaben fertig sind, müssen wir es herunterfahren, da ExecutorService die Aufgabe in verschiedenen Threads ausführt. Wenn wir den ExecutorService nicht herunterfahren, laufen die Threads weiter und die JVM wird nicht heruntergefahren.

zähle verschiedene SQL

Der Vorgang des Herunterfahrens kann mit den folgenden drei Methoden durchgeführt werden:

  • Shutdown()-Methode
  • ShutdownNow()-Methode
  • waitTermination()-Methode