În Java , Viitor este o interfata care îi aparține java.util.concurrent pachet . Este folosit pentru a reprezenta rezultatul unui calcul asincron. Interfața oferă metode pentru a verifica dacă calculul este finalizat sau nu, pentru a aștepta finalizarea acestuia și pentru a prelua rezultatul calculului. Odată ce sarcina sau calculul este finalizat, nu se poate anula calculul.
Sintaxă:
public interface Future
Exemplu de viitor Java
Cel mai bun exemplu de Java Future este ExecutorService interfață. Produce un obiect Future (din unele dintre metodele lor) pentru urmărirea progresului uneia sau mai multor sarcini asincrone.
Metode ale interfeței viitorului
Interfața oferă următoarele cinci metode:
Metodă | Descriere |
---|---|
Anulare() | Încearcă să anuleze execuția sarcinii. |
obține() | Metoda așteaptă, dacă este necesar, să se finalizeze calculul și apoi își preia rezultatul. |
obține() | Așteaptă, dacă este necesar, cel mult timpul dat pentru finalizarea calculului și apoi își preia rezultatul, dacă este disponibil. |
este anulat() | Returnează adevărat dacă sarcina a fost anulată înainte de finalizarea acesteia. |
este gata() | Returnează adevărat dacă sarcina este finalizată. |
Au existat unele deficiențe ale interfeței Viitorul, care sunt după cum urmează:
- Folosind Future, calculul nu poate fi finalizat manual.
- Nu notifică odată ce comutarea este finalizată.
- Lanțul său nu poate fi creat și combinat.
Pentru a depăși limitările de mai sus, Java 8 introdus CompletabilViitorul .
Utilizarea viitorului în programarea asincronă
Obținerea rezultatului
După cum am discutat mai sus, Viitorul reprezintă rezultatul unei sarcini asincrone. Pentru a prelua rezultatul acestei sarcini asincrone, interfața Java Future oferă următoarele două versiuni ale metodelor get() ambele returnează un obiect. Rețineți că tipul returnat poate fi un tip generic. De exemplu:
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(); }
Notă: Dacă încercăm să invocăm metoda get() înainte ca sarcina asincronă să fie finalizată, metoda get() se va bloca până când rezultatul este gata.
Pentru a depăși neajunsul de mai sus, interfața Future oferă o altă versiune a metodei get() care exceptează o cantitate de timp (în milisecunde) ca parametru. Reprezintă că Viitorul va aștepta o perioadă de timp pentru a finaliza sarcina după ce rezultatul va fi disponibil în Viitor. De exemplu:
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. }
Dacă Future nu obține niciun rezultat în timpul specificat, a TimeoutException este aruncat de Viitor.
Anulați o sarcină asincronă
De asemenea, putem anula o sarcină asincronă în orice moment apelând la Anulare() metoda interfeței Viitorului. De exemplu:
Future future = ... // Get Future from somewhere future.cancel();
Verificați dacă o sarcină asincronă este gata
Interfața oferă o metodă este gata() pentru a verifica dacă sarcina asincronă este finalizată sau nu. De exemplu:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Verificați dacă o sarcină asincronă este anulată
Interfața Future oferă o metodă este anulat() pentru a verifica dacă sarcina asincronă reprezentată de Future este anulată sau nu. Returnează adevărat dacă sarcina este anulată cu succes, altfel returnează false. De exemplu:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Exemplu de viitor Java
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(); } }
Ieșire: