logo

Budúci príklad Java

In Java , Budúcnosť je rozhranie ktorá patrí java.util.concurrent balík . Používa sa na vyjadrenie výsledku asynchrónneho výpočtu. Rozhranie poskytuje metódy na kontrolu, či je výpočet dokončený alebo nie, na čakanie na jeho dokončenie a na získanie výsledku výpočtu. Po dokončení úlohy alebo výpočtu nie je možné výpočet zrušiť.

Syntax:

 public interface Future 

Príklad Java Future

Najlepším príkladom Java Future je ExecutorService rozhranie. Vytvára objekt budúcnosti (z niektorých ich metód) na sledovanie priebehu jednej alebo viacerých asynchrónnych úloh.

Metódy rozhrania budúcnosti

Rozhranie poskytuje nasledujúcich päť metód:

Metóda Popis
Zrušiť() Pokúsi sa zrušiť vykonanie úlohy.
dostať () Metóda v prípade potreby čaká na dokončenie výpočtu a potom získa svoj výsledok.
dostať () V prípade potreby čaká na dokončenie výpočtu maximálne daný čas a potom načíta výsledok, ak je k dispozícii.
isCancelled() Vráti hodnotu true, ak bola úloha zrušená pred jej dokončením.
je hotové() Ak je úloha dokončená, vráti hodnotu true.

Vyskytli sa určité nedostatky rozhrania budúcnosti, ktoré sú nasledovné:

  • Pomocou Future nemožno výpočet dokončiť manuálne.
  • Po dokončení komutácie neinformuje.
  • Jeho reťaz nemožno vytvárať a kombinovať.

Aby sa prekonali vyššie uvedené obmedzenia, Java 8 zavedené CompletableFuture .

Použitie budúcnosti v asynchrónnom programovaní

Získanie výsledku

Ako sme diskutovali vyššie, budúcnosť predstavuje výsledok asynchrónnej úlohy. Aby bolo možné získať výsledok tejto asynchrónnej úlohy, rozhranie Java Future poskytuje nasledujúce dve verzie metód get(), obe vracajú objekt. Upozorňujeme, že návratový typ môže byť všeobecný typ. Napríklad:

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

Poznámka: Ak sa pokúsime vyvolať metódu get() pred dokončením asynchrónnej úlohy, metóda get() sa zablokuje, kým nebude pripravený výsledok.

Aby sa prekonal vyššie uvedený nedostatok, rozhranie budúcnosti poskytuje inú verziu metódy get(), ktorá okrem množstva čas (v milisekundách) ako parameter. Znamená to, že Budúcnosť bude čakať určitý čas na dokončenie úlohy po tom, ako bude výsledok dostupný v budúcnosti. Napríklad:

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

Ak Future nedosiahne žiadny výsledok v stanovenom čase, a TimeoutException je vrhnutý Budúcnosťou.

Zrušte asynchrónnu úlohu

Asynchrónnu úlohu môžeme kedykoľvek zrušiť aj volaním Zrušiť() metóda rozhrania budúcnosti. Napríklad:

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

Skontrolujte, či je asynchrónna úloha dokončená

Rozhranie poskytuje metódu je hotové() skontrolovať, či je asynchrónna úloha dokončená alebo nie. Napríklad:

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

Skontrolujte, či je asynchrónna úloha zrušená

Rozhranie budúcnosti poskytuje metódu isCancelled() skontrolovať, či je asynchrónna úloha reprezentovaná Future zrušená alebo nie. Ak je úloha úspešne zrušená, vráti hodnotu true, inak vráti hodnotu false. Napríklad:

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

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

Výkon:

Budúci príklad Java