logo

Wywoływalne a przyszłość w Javie

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 cyframi
Java
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 Javie
Java
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ść

FunkcjaMożliwość wywołaniaPrzyszły
Zamiar Reprezentuje zadanie, które zwraca wynikReprezentuje wynik zadania asynchronicznego
Typ zwrotu Zwraca wynik po wykonaniuPrzechowuje wynik zwrócony przez Callable
Zdefiniowano w pakiet java.util.concurrentpakiet java.util.concurrent
Wykonanie Przesłano do ExecutorServiceZwró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ątkiObsługuje wyniki i wyjątki po wykonaniu
Stosowanie Określa, co wykonaćKontroluje monitoruje i pobiera wynik zadania
Utwórz quiz