logo

Java Future Eksempel

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:

Java Future Eksempel