W Javie wielowątkowość umożliwia jednoczesne wykonywanie zadań, co poprawia wydajność i responsywność. Tradycyjnie programiści używali interfejsu Runnable do definiowania zadań, ale ma on dwa główne ograniczenia: nie może zwrócić wyniku i nie może zgłosić sprawdzonych wyjątków. Aby przezwyciężyć te problemy, Java wprowadziła interfejsy Callable i Future w Javie 5.
Wywoływalny interfejs
The Wywoływalny interfejs reprezentuje zadanie, które zwraca wynik i może zgłosić wyjątek. Jest podobny do Runnable, ale jest bardziej elastyczny, ponieważ może zwracać wartość i zgłaszać sprawdzone wyjątki.
alfabet z cyframiJava
import java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
Wyjście
Result: 15
Wyjaśnienie: Zadanie wywoływalne jest przesyłane do wykonawcy. Oblicza sumę liczb od 1 do 5 i zwraca wynik. Wynik jest pobierany za pomocą future.get() po zakończeniu zadania.
Przyszły interfejs
The Przyszły interfejs reprezentuje wynik obliczeń asynchronicznych. Kiedy przesyłasz zadanie wywoływalne lub uruchamialne do usługi ExecutorService, zwraca ona obiekt Future.
Zastępowanie metody w JavieJava
import java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
Wyjście
Result: 30
Wyjaśnienie: TheCallableobliczenia zadań10 + 2 and ExecutorService.submit()metoda zwraca aFutureobiekt. Używaniefuture.get()wynik otrzymamy po zakończeniu obliczeń.
Wywoływalne vs Przyszłość
| Funkcja | Możliwość wywołania | Przyszły |
|---|---|---|
| Zamiar | Reprezentuje zadanie, które zwraca wynik | Reprezentuje wynik zadania asynchronicznego |
| Typ zwrotu | Zwraca wynik po wykonaniu | Przechowuje wynik zwrócony przez Callable |
| Zdefiniowano w | pakiet java.util.concurrent | pakiet java.util.concurrent |
| Wykonanie | Przesłano do ExecutorService | Zwrócony przez ExecutorService.submit() |
| Metody | Ma jedną metodę call() | Zawiera metody takie jak get() isDone() cancel() |
| Obsługa wyjątków | Może zgłaszać sprawdzone wyjątki | Obsługuje wyniki i wyjątki po wykonaniu |
| Stosowanie | Określa, co wykonać | Kontroluje monitoruje i pobiera wynik zadania |