Java Callable Future Example
Einer der Vorteile des Java Executor-Frameworks besteht darin, dass wir gleichzeitige Aufgaben ausführen können, die nach der Verarbeitung der Aufgaben möglicherweise ein einzelnes Ergebnis zurückgeben. Die Java Concurrency API erreicht dies mit den folgenden beiden Schnittstellen Callable
und Future
.
Java Aufrufbare und zukünftige Schnittstellen
1.1. Callable
Callable
Schnittstelle hat die call()
Methode. Bei dieser Methode müssen wir die Logik einer Aufgabe implementieren. Die Callable
-Schnittstelle ist eine parametrisierte Schnittstelle, dh wir müssen den Datentyp angeben, den die call()
-Methode zurückgibt.
2.2. Die
Future
Schnittstelle verfügt über Methoden, um das von einem Callable
Objekt generierte Ergebnis zu erhalten und seinen Status zu verwalten.
Java Callable Future Example
In diesem Beispiel erstellen wir ein FactorialCalculator
vom Typ Callable
. Dies bedeutet, dass wir die call()
-Methode überschreiben und nach der Berechnung das Ergebnis der call()
-Methode zurückgeben. Dieses Ergebnis kann später aus der Referenz Future
des Hauptprogramms abgerufen werden.
Testen wir nun den obigen Fakultätsrechner mit zwei Threads und 4 Zahlen.
Programmausgabe.
Hier haben wir ein Callable
-Objekt gesendet, das in einem Executor mit der submit()
-Methode ausgeführt werden soll. Diese Methode empfängt ein Callable
-Objekt als Parameter und gibt ein Future
-Objekt zurück, das wir mit zwei Hauptzielen verwenden können –
- Wir können den Status der Aufgabe steuern – wir können die Aufgabe abbrechen und überprüfen, ob sie abgeschlossen ist. Zu diesem Zweck haben wir die Methode
isDone()
verwendet, um zu überprüfen, ob die Aufgaben abgeschlossen waren. - Wir können das von der call() -Methode zurückgegebene Ergebnis erhalten. Zu diesem Zweck haben wir die Methode
get()
verwendet. Diese Methode wartet, bis dasCallable
-Objekt die Ausführung dercall()
-Methode beendet und sein Ergebnis zurückgegeben hat.Wenn der Thread unterbrochen wird, während die
get()
-Methode auf das Ergebnis wartet, wird eineInterruptedException
-Ausnahme ausgelöst. Wenn diecall()
-Methode eine Ausnahme auslöst, löst diese Methode eineExecutionException
-Ausnahme aus.
Die Future
Schnittstelle bietet eine andere Version der get()
Methode, dh get(longtimeout,TimeUnitunit) . Diese Version der get-Methode wartet, wenn das Ergebnis der Aufgabe nicht verfügbar ist, die angegebene Zeit darauf. Wenn der angegebene Zeitraum verstrichen ist und das Ergebnis noch nicht verfügbar ist, gibt die Methode einen null
-Wert zurück.
Viel Spaß beim Lernen!!