Es gibt zwei Ansätze zum Senden und Abfragen von Tasks für Ergebnisse
%Vor% Verwenden Sie die Kombination von Callable
und Future
und senden Sie sie an ExecutorService
. Abrufen des Ergebnisses mit future.get()
.
Verwenden Sie FutureTask
. Dies wird Callable
umbrechen und dann das Ergebnis mit FutureTask
abrufen.
Was ist der Vorteil der Verwendung von FutureTask
über Callable
+ zukünftige Kombination?
Fast gar keine. Ein kurzer Blick auf GrepCode von AbstractExecutorService
zeigt an, dass jede dieser Methoden einfache Hilfsmethoden sind, die die Callable
/ Runnable
in eine Future
für dich schlüpfen.
Mit Future können wir den Status der Callable-Task ermitteln und das zurückgegebene Objekt abrufen. Sie stellt die get () -Methode bereit, die auf das Beenden des Callable warten und das Ergebnis zurückgeben kann.
Future stellt die cancel () -Methode zum Abbrechen der zugehörigen Callable-Task bereit. Es gibt eine überladene Version der get () -Methode, in der wir die Zeit angeben können, in der auf das Ergebnis gewartet wird. Es ist nützlich zu vermeiden, dass der aktuelle Thread für längere Zeit blockiert wird. Es gibt isDone () - und isCancelled () -Methoden, um den aktuellen Status der zugeordneten Callable-Task herauszufinden.
Hier ist ein einfaches Beispiel für die Callable-Task, die den Namen des Threads zurückgibt, der die Task nach einer Sekunde ausführt. Wir verwenden das Executor-Framework, um 100 Tasks parallel auszuführen, und verwenden Future, um das Ergebnis der übertragenen Tasks zu erhalten.
%Vor%Wo FutureTask als Basis konkrete Implementierung der Future-Schnittstelle ist und asynchrone Verarbeitung bereitstellt. Es enthält die Methoden zum Starten und Abbrechen einer Aufgabe sowie Methoden, die den Status der FutureTask als abgeschlossen oder abgebrochen zurückgeben können. Wir benötigen ein aufrufbares Objekt, um eine zukünftige Aufgabe zu erstellen, und dann können wir den Java Thread Pool Executor verwenden, um diese asynchron zu verarbeiten.
Sehen wir uns das Beispiel von FutureTask mit einem einfachen Programm an.
Da FutureTask ein aufrufbares Objekt benötigt, werden wir eine einfache Callable-Implementierung erstellen.
%Vor%Tags und Links java multithreading concurrency future