v Jáva , Budoucnost je rozhraní která patří java.util.concurrent balík . Používá se k reprezentaci výsledku asynchronního výpočtu. Rozhraní poskytuje metody pro kontrolu, zda je výpočet dokončen nebo ne, pro čekání na jeho dokončení a pro získání výsledku výpočtu. Jakmile je úkol nebo výpočet dokončen, nelze výpočet zrušit.
Syntax:
public interface Future
Příklad Java Future
Nejlepším příkladem Java Future je ExekutorService rozhraní. Vytváří objekt Future (z některých jejich metod) pro sledování průběhu jedné nebo více asynchronních úloh.
Metody rozhraní budoucnosti
Rozhraní poskytuje následujících pět metod:
Metoda | Popis |
---|---|
zrušení() | Pokusí se zrušit provedení úlohy. |
dostat() | Metoda v případě potřeby čeká na dokončení výpočtu a poté načte výsledek. |
dostat() | Čeká, pokud je to nutné, maximálně danou dobu na dokončení výpočtu a poté načte jeho výsledek, je-li k dispozici. |
isCancelled() | Vrací hodnotu true, pokud byla úloha zrušena před jejím dokončením. |
je hotovo() | Pokud je úkol dokončen, vrátí hodnotu true. |
Vyskytly se některé nedostatky rozhraní budoucnosti, které jsou následující:
- Pomocí Future nelze výpočet dokončit ručně.
- Jakmile je komutace dokončena, neinformuje.
- Jeho řetězec nelze vytvořit a kombinovat.
Aby bylo možné překonat výše uvedená omezení, Java 8 představil CompletableFuture .
Použití budoucnosti v asynchronním programování
Získání výsledku
Jak jsme diskutovali výše, budoucnost představuje výsledek asynchronního úkolu. Aby bylo možné získat výsledek této asynchronní úlohy, poskytuje rozhraní Java Future následující dvě verze metod get(), obě vracejí objekt. Všimněte si, že návratový typ může být obecný typ. Napří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: Pokud se pokusíme vyvolat metodu get() před dokončením asynchronní úlohy, metoda get() se zablokuje, dokud nebude výsledek připraven.
Aby bylo možné překonat výše uvedený nedostatek, poskytuje rozhraní budoucnosti jinou verzi metody get(), která kromě čas (v milisekundách) jako parametr. Znamená to, že Budoucnost bude čekat určitou dobu na dokončení úkolu poté, co bude tento výsledek k dispozici v budoucnosti. Napří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. }
Pokud Future nezíská žádný výsledek ve stanovené době, a TimeoutException je vržena budoucností.
Zrušení asynchronní úlohy
Asynchronní úlohu můžeme také kdykoli zrušit voláním zrušení() metoda budoucího rozhraní. Například:
Future future = ... // Get Future from somewhere future.cancel();
Zkontrolujte, zda je dokončena asynchronní úloha
Rozhraní poskytuje metodu je hotovo() zkontrolovat, zda je asynchronní úloha dokončena nebo ne. Například:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Zkontrolujte, zda je asynchronní úloha zrušena
Rozhraní budoucnosti poskytuje metodu isCancelled() zkontrolovat, zda je asynchronní úloha reprezentovaná Future zrušena nebo ne. Pokud je úloha úspěšně zrušena, vrátí hodnotu true, jinak vrátí hodnotu false. Například:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Pří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ýstup: