logo

Java jövőbeli példa

Ban ben Jáva , Jövő egy felület ami hozzá tartozik java.util.concurrent csomag . Egy aszinkron számítás eredményének ábrázolására szolgál. Az interfész lehetőséget ad annak ellenőrzésére, hogy a számítás befejeződött-e vagy sem, hogy megvárjuk a befejezést, és lekérjük a számítás eredményét. A feladat vagy a számítás befejezése után a számítást nem lehet megszakítani.

Szintaxis:

 public interface Future 

Példa a Java Future-ra

A Java Future legjobb példája az VégrehajtóSzolgálat felület. Előállít egy Future objektumot (egyes módszereikből) egy vagy több aszinkron feladat előrehaladásának nyomon követésére.

A jövő interfész módszerei

Az interfész a következő öt módszert kínálja:

Módszer Leírás
megszünteti() Megpróbálja megszakítani a feladat végrehajtását.
kap() A metódus szükség esetén megvárja a számítás befejezését, majd lekéri az eredményt.
kap() Ha szükséges, legfeljebb a megadott ideig vár a számítás befejeződéséig, majd lekéri az eredményt, ha elérhető.
törölve() Igaz értéket ad vissza, ha a feladatot a befejezése előtt törölték.
kész() Igazat ad vissza, ha a feladat befejeződött.

A Future felületnek volt néhány hiányossága, amelyek a következők:

  • A Future használatával a számítás nem fejezhető be manuálisan.
  • Nem értesít, ha a kommutáció befejeződött.
  • Lánca nem hozható létre és nem kombinálható.

A fenti korlátok leküzdése érdekében Java 8 bemutatott CompletableFuture .

A jövő használata az aszinkron programozásban

Eredmény elérése

Ahogy fentebb tárgyaltuk, a Jövő egy aszinkron feladat eredménye. Az aszinkron feladat eredményének lekéréséhez a Java Future felület a get() metódusok következő két változatát biztosítja, amelyek egy objektumot adnak vissza. Vegye figyelembe, hogy a visszatérési típus általános típus lehet. Például:

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

Megjegyzés: Ha megpróbáljuk meghívni a get() metódust az aszinkron feladat befejezése előtt, a get() metódus blokkolni fog, amíg az eredmény készen nem lesz.

A fenti hiányosság kiküszöbölése érdekében a Future felület a get() metódus egy másik változatát biztosítja, amely kivételt képez idő (ezredmásodpercben) paraméterként. Ez azt jelenti, hogy a Jövő bizonyos ideig vár a feladat elvégzésére, miután az eredmény elérhető lesz a Jövőben. Például:

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

Ha a Future nem ad eredményt a megadott időn belül, a TimeoutException dobja a Jövő.

Töröljön egy aszinkron feladatot

Az aszinkron feladatot bármikor törölhetjük, ha meghívjuk a megszünteti() a Future interfész módszere. Például:

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

Ellenőrizze, hogy az aszinkron feladat elkészült-e

Az interfész módszert ad kész() annak ellenőrzésére, hogy az aszinkron feladat befejeződött-e vagy sem. Például:

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

Ellenőrizze, hogy egy aszinkron feladat megszakadt-e

A Future felület egy módszert biztosít törölve() annak ellenőrzésére, hogy a Future által képviselt aszinkron feladat törölve van-e vagy sem. Igazat ad vissza, ha a feladatot sikeresen törölték, egyébként hamis értéket ad vissza. Például:

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

Példa a Java Future-ra

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

Kimenet:

Java jövőbeli példa