Į 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: