I Java , Framtid er en grensesnitt som hører til java.util.samtidig pakke . Den brukes til å representere resultatet av en asynkron beregning. Grensesnittet gir metodene for å sjekke om beregningen er fullført eller ikke, for å vente på dens fullføring og for å hente resultatet av beregningen. Når oppgaven eller beregningen er fullført, kan man ikke avbryte beregningen.
Syntaks:
public interface Future
Eksempel på Java Future
Det beste eksemplet på Java Future er ExecutorService grensesnitt. Den produserer et Future-objekt (fra noen av metodene deres) for å spore fremdriften til en eller flere asynkrone oppgaver.
Metoder for fremtidens grensesnitt
Grensesnittet gir følgende fem metoder:
Metode | Beskrivelse |
---|---|
Avbryt() | Den prøver å avbryte utførelsen av oppgaven. |
få() | Metoden venter om nødvendig på at beregningen er fullført, og henter deretter resultatet. |
få() | Venter om nødvendig i maksimalt den gitte tiden før beregningen er fullført, og henter deretter resultatet, hvis tilgjengelig. |
er kansellert() | Den returnerer sann hvis oppgaven ble kansellert før den ble fullført. |
er ferdig() | Den returnerer sann hvis oppgaven er fullført. |
Det var noen mangler ved Future-grensesnittet som er som følger:
- Ved å bruke Future kan ikke beregningen fullføres manuelt.
- Den varsler ikke når kommuteringen er fullført.
- Dens kjede kan ikke opprettes og kombineres.
For å overvinne begrensningene ovenfor, Java 8 introdusert CompletableFuture .
Bruke Future i asynkron programmering
Får resultat
Som vi har diskutert ovenfor, representerer fremtiden resultatet av en asynkron oppgave. For å hente resultatet av den asynkrone oppgaven, gir Java Future-grensesnittet følgende to versjoner av get()-metodene som begge returnerer et objekt. Merk at returtypen kan være en generisk type. For eksempel:
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(); }
Merk: Hvis vi prøver å påkalle get()-metoden før den asynkrone oppgaven er fullført, vil get()-metoden blokkere til resultatet er klart.
For å overvinne den ovennevnte mangelen, gir Future-grensesnittet en annen versjon av get()-metoden som unntar en mengde av tid (i millisekunder) som en parameter. Det representerer at fremtiden vil vente en stund på å fullføre oppgaven etter at resultatet vil være tilgjengelig i fremtiden. For eksempel:
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. }
Hvis Future ikke får noe resultat innen den angitte tiden, a Unntak for tidsavbrudd er kastet av fremtiden.
Avbryt en asynkron oppgave
Vi kan også kansellere en asynkron oppgave når som helst ved å ringe Avbryt() metoden til Future-grensesnittet. For eksempel:
Future future = ... // Get Future from somewhere future.cancel();
Sjekk om en asynkron oppgave er utført
Grensesnittet gir en metode er ferdig() for å sjekke om den asynkrone oppgaven er fullført eller ikke. For eksempel:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Sjekk om en asynkron oppgave er kansellert
Future-grensesnittet gir en metode er kansellert() for å sjekke om den asynkrone oppgaven representert av Future er kansellert eller ikke. Den returnerer true hvis oppgaven avbrytes vellykket, ellers returnerer false. For eksempel:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Eksempel på Java Future
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(); } }
Produksjon: