Java Callable Future Example
jedną z zalet Java executor Framework jest to, że możemy uruchamiać równoległe zadania, które mogą zwracać pojedynczy wynik po przetworzeniu zadań. API współbieżności Java osiąga to za pomocą następujących dwóch interfejsów Callable
i Future
.
Java Callable and Future interfaces
1.1. Interfejs
Callable
posiada metodę call()
. W tej metodzie musimy zaimplementować logikę zadania. Interfejs Callable
jest interfejsem sparametryzowanym, co oznacza, że musimy podać typ danych, które zwróci metoda call()
.
2.2. Interfejs Future
Future
posiada metody do uzyskiwania wyniku generowanego przez obiekt Callable
i do zarządzania jego stanem.
Java Callable Future Example
w tym przykładzie tworzymy FactorialCalculator
, który jest typu Callable
. Oznacza to, że nadpisamy jej metodę call()
i po obliczeniu, zwrócimy wynik z metody call()
. Wynik ten można później pobrać z Future
referencji posiadanej przez program główny.
teraz przetestujmy powyższy Kalkulator silni używając dwóch wątków i 4 liczb.
wyjście programu.
tutaj wysłaliśmy obiekt Callable
do wykonania w executorze przy użyciu metody submit()
. Metoda ta otrzymuje jako parametr obiekt Callable
i zwraca obiekt Future
, którego możemy użyć z dwoma głównymi celami–
- możemy kontrolować status zadania-możemy anulować zadanie i sprawdzić, czy zostało ono zakończone. W tym celu użyliśmy metody
isDone()
, aby sprawdzić, czy zadania zostały zakończone. - możemy uzyskać wynik zwracany przez metodę call (). W tym celu użyliśmy metody
get()
. Metoda ta czeka, aż obiektCallable
zakończy wykonywanie metodycall()
i zwróci jej wynik.jeśli wątek jest przerwany, gdy metoda
get()
czeka na wynik, wyrzuca wyjątekInterruptedException
. Jeśli metodacall()
wyrzuca wyjątek, ta metoda wyrzuca wyjątekExecutionException
.
interfejs Future
udostępnia inną wersję metody get()
tzn. get(longtimeout,TimeUnitunit). Ta wersja metody get, jeśli wynik zadania nie jest dostępny, czeka na niego przez określony czas. Jeżeli określony okres czasu upłynie, a wynik nie jest jeszcze dostępny, metoda zwraca wartość null
.
Szczęśliwej Nauki !!