logo

Java ateities pavyzdys

Į Java , Ateitis yra sąsaja kuri priklauso java.util.concurrent paketą . Jis naudojamas asinchroninio skaičiavimo rezultatui pavaizduoti. Sąsaja pateikia metodus, kaip patikrinti, ar skaičiavimas baigtas, ar ne, palaukti, kol jis bus baigtas, ir gauti skaičiavimo rezultatą. Kai užduotis arba skaičiavimas baigtas, skaičiavimo atšaukti negalima.

Sintaksė:

int į eilutę java
 public interface Future 

Java ateities pavyzdys

Geriausias „Java Future“ pavyzdys yra Vykdytojo paslauga sąsaja. Jis sukuria ateities objektą (iš kai kurių jų metodų), skirtą vienos ar kelių asinchroninių užduočių eigai stebėti.

Ateities sąsajos metodai

Sąsaja siūlo šiuos penkis metodus:

Metodas apibūdinimas
atšaukti () Jis bando atšaukti užduoties vykdymą.
gauti () Metodas, jei reikia, laukia, kol bus baigtas skaičiavimas, ir tada nuskaito rezultatą.
gauti () Jei reikia, laukia daugiausiai nurodytą laiką, kol bus baigtas skaičiavimas, tada nuskaito rezultatą, jei yra.
isCanceled () Grąžinama tiesa, jei užduotis buvo atšaukta iki jos pabaigos.
yra padaryta() Grąžinama tiesa, jei užduotis baigta.

Ateities sąsajoje buvo keletas trūkumų, kurie yra tokie:

  • Naudojant Future, skaičiavimo negalima atlikti rankiniu būdu.
  • Jis nepraneša, kai komutavimas baigtas.
  • Jo grandinės negalima sukurti ir sujungti.

Norėdami įveikti aukščiau nurodytus apribojimus, Java 8 pristatė CompletableFuture .

Ateities naudojimas asinchroniniame programavime

Rezultatas

Kaip jau aptarėme aukščiau, ateitis yra asinchroninės užduoties rezultatas. Kad būtų galima gauti tos asinchroninės užduoties rezultatą, Java Future sąsaja pateikia šias dvi get() metodų versijas, kurios abu grąžina objektą. Atminkite, kad grąžinimo tipas gali būti bendras. Pavyzdžiui:

 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(); } 

Pastaba: jei bandysime iškviesti metodą get() prieš baigiant asinchroninę užduotį, metodas get() bus blokuojamas, kol rezultatas bus paruoštas.

Siekiant pašalinti minėtą trūkumą, ateities sąsaja pateikia kitą get() metodo versiją, kuri neįtraukia laikas (milisekundėmis) kaip parametras. Tai reiškia, kad ateitis lauks tam tikrą laiką, kad atliktų užduotį, kai rezultatas bus prieinamas Ateityje. Pavyzdžiui:

 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. } 

Jei Future negauna jokio rezultato per nurodytą laiką, a TimeoutException išmeta Ateities.

Atšaukite asinchroninę užduotį

Be to, bet kuriuo metu galime atšaukti asinchroninę užduotį paskambinę atšaukti () ateities sąsajos metodas. Pavyzdžiui:

 Future future = ... // Get Future from somewhere future.cancel(); 

Patikrinkite, ar atlikta asinchroninė užduotis

Sąsaja pateikia metodą yra padaryta() patikrinti, ar asinchroninė užduotis atlikta, ar ne. Pavyzdžiui:

 Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else } 

Patikrinkite, ar asinchroninė užduotis atšaukta

Ateities sąsaja suteikia metodą isCanceled () patikrinti, ar asinchroninė užduotis, kurią reiškia ateitis, atšaukta, ar ne. Grąžina tiesa, jei užduotis buvo sėkmingai atšaukta, kitu atveju grąžina false. Pavyzdžiui:

 Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { } 

Java ateities pavyzdys

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(); } } 

Išvestis:

Java ateities pavyzdys