W Jawa , Przyszły jest interfejs to należy do java.util.concurrent pakiet . Służy do reprezentowania wyniku obliczeń asynchronicznych. Interfejs udostępnia metody sprawdzające, czy obliczenia zostały ukończone, czy nie, oczekujące na ich zakończenie i pobierające wynik obliczeń. Po zakończeniu zadania lub obliczeń nie można anulować obliczeń.
Składnia:
podciąg Java
public interface Future
Przykład przyszłości Java
Najlepszym przykładem Java Future jest Usługa wykonawcy interfejs. Tworzy obiekt Future (z niektórych metod) do śledzenia postępu jednego lub większej liczby zadań asynchronicznych.
Metody przyszłego interfejsu
Interfejs udostępnia pięć następujących metod:
metoda | Opis |
---|---|
anulować() | Próbuje anulować wykonanie zadania. |
Dostawać() | Metoda czeka, jeśli to konieczne, na zakończenie obliczeń, a następnie pobiera wynik. |
Dostawać() | W razie potrzeby czeka co najwyżej przez zadany czas na zakończenie obliczeń, a następnie pobiera jego wynik, jeśli jest dostępny. |
jest odwołany() | Zwraca wartość true, jeśli zadanie zostało anulowane przed jego zakończeniem. |
skończone() | Zwraca wartość true, jeśli zadanie zostało ukończone. |
W interfejsie Future wystąpiły pewne niedociągnięcia, które są następujące:
- Korzystając z Future, obliczeń nie można wykonać ręcznie.
- Nie powiadamia o zakończeniu komutacji.
- Jego łańcucha nie można tworzyć ani łączyć.
Aby pokonać powyższe ograniczenia, Java 8 wprowadzony Kompletna przyszłość .
Wykorzystanie przyszłości w programowaniu asynchronicznym
Uzyskiwanie wyniku
Jak omówiliśmy powyżej, przyszłość reprezentuje wynik zadania asynchronicznego. Aby pobrać wynik tego asynchronicznego zadania, interfejs Java Future udostępnia dwie następujące wersje metod get(), obie zwracają obiekt. Należy pamiętać, że typ zwracany może być typem ogólnym. Na przykład:
Future future = ... // get Future by starting async task // do something else, until ready to check result via Future // get result from Future try { Object result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
Uwaga: Jeśli spróbujemy wywołać metodę get() przed zakończeniem zadania asynchronicznego, metoda get() zostanie zablokowana do czasu, aż wynik będzie gotowy.
Aby przezwyciężyć powyższe niedociągnięcia, interfejs Future udostępnia inną wersję metody get(), która zawiera wyjątek czas (w milisekundach) jako parametr. Reprezentuje to, że Przyszłość będzie czekać przez pewien czas na wykonanie zadania, po tym jak wynik będzie dostępny w Przyszłości. Na przykład:
wyjątek nullpointer
try { Object result = future.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { // thrown if timeout time interval passes // before a result is available. }
Jeśli Future nie uzyska żadnego wyniku w określonym czasie, a Wyjątek limitu czasu zostaje rzucony przez Przyszłość.
Anuluj zadanie asynchroniczne
Możemy również anulować zadanie asynchroniczne w dowolnym momencie, wywołując metodę anulować() metoda interfejsu Future. Na przykład:
wyjątek rzuca java
Future future = ... // Get Future from somewhere future.cancel();
Sprawdź, czy zadanie asynchroniczne zostało wykonane
Interfejs udostępnia metodę skończone() aby sprawdzić, czy zadanie asynchroniczne zostało ukończone, czy nie. Na przykład:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Sprawdź, czy zadanie asynchroniczne zostało anulowane
Interfejs Future udostępnia metodę jest odwołany() aby sprawdzić, czy zadanie asynchroniczne reprezentowane przez Future zostało anulowane, czy nie. Zwraca wartość true, jeśli zadanie zostało pomyślnie anulowane, w przeciwnym razie zwraca wartość false. Na przykład:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Przykład przyszłości Java
FutureExample.java
import java.util.concurrent.*; public class FutureExample { public static void main(String args[]) throws InterruptedException, ExecutionException { //ExecutorService allows us to execute tasks on threads asynchronously ExecutorService es = Executors.newSingleThreadExecutor(); //getting future //the method submit() submits a value-returning task for execution and returns the Future Future future = es.submit(() -> { //sleep thread for 2 seconds Thread.sleep(2000); return 'Welcome to Javatpoint'; }); //checks if the task is completed or not while(!future.isDone()) { System.out.println('The task is still in process.....'); //sleep thread for 2 milliseconds Thread.sleep(200); } System.out.println('Task completed! getting the result'); //getting the result after completing the task String result = future.get(); //prints the result System.out.println(result); es.shutdown(); } }
Wyjście: