notri Java , Prihodnost je vmesnik ki pripada java.util.concurrent paket . Uporablja se za predstavitev rezultata asinhronega računanja. Vmesnik ponuja metode za preverjanje, ali je izračun končan ali ne, za čakanje na njegov zaključek in za pridobitev rezultata izračuna. Ko je naloga ali izračun končan, računanja ni mogoče preklicati.
Sintaksa:
public interface Future
Primer Java Future
Najboljši primer Java Future je ExecutorService vmesnik. Proizvaja objekt Future (iz nekaterih njihovih metod) za sledenje napredku ene ali več asinhronih nalog.
Metode prihodnjega vmesnika
Vmesnik ponuja naslednjih pet metod:
Metoda | Opis |
---|---|
prekliči () | Poskuša preklicati izvedbo naloge. |
dobiti () | Metoda po potrebi počaka, da se izračun zaključi, nato pa pridobi svoj rezultat. |
dobiti () | Počaka, če je potrebno, največ dani čas, da se izračun zaključi, in nato pridobi njegov rezultat, če je na voljo. |
isCancelled() | Vrne true, če je bilo opravilo preklicano pred zaključkom. |
je narejeno() | Vrne true, če je opravilo dokončano. |
V vmesniku Future je bilo nekaj pomanjkljivosti, ki so naslednje:
- Če uporabljate Future, izračuna ni mogoče dokončati ročno.
- Ne obvesti, ko je komutacija končana.
- Njegove verige ni mogoče ustvariti in združiti.
Da bi presegli zgornje omejitve, Java 8 predstavljen CompletableFuture .
Uporaba prihodnosti v asinhronem programiranju
Pridobivanje rezultata
Kot smo razpravljali zgoraj, prihodnost predstavlja rezultat asinhrone naloge. Za pridobitev rezultata te asinhrone naloge vmesnik Java Future ponuja naslednji dve različici metod get(), obe vrneta objekt. Upoštevajte, da je povratni tip lahko splošen tip. Na primer:
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(); }
Opomba: Če poskušamo priklicati metodo get(), preden je asinhrona naloga končana, se bo metoda get() blokirala, dokler rezultat ni pripravljen.
Da bi odpravili zgornjo pomanjkljivost, vmesnik Future ponuja drugo različico metode get(), ki izvzame količino čas (v milisekundah) kot parameter. Predstavlja, da bo Prihodnost čakala nekaj časa, da dokonča nalogo, potem ko bo ta rezultat na voljo v Prihodnosti. Na primer:
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. }
Če Future ne dobi nobenega rezultata v določenem času, a TimeoutException vrže Prihodnost.
Prekliči asinhrono opravilo
Prav tako lahko kadar koli prekličemo asinhrono opravilo, tako da pokličemo prekliči () metoda vmesnika Future. Na primer:
Future future = ... // Get Future from somewhere future.cancel();
Preverite, ali je asinhrona naloga končana
Vmesnik ponuja metodo je narejeno() da preverite, ali je asinhrona naloga dokončana ali ne. Na primer:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Preverite, ali je asinhrono opravilo preklicano
Vmesnik Future ponuja metodo isCancelled() da preveri, ali je asinhrono opravilo, ki ga predstavlja Future, preklicano ali ne. Če je opravilo uspešno preklicano, vrne true, drugače vrne false. Na primer:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Primer 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(); } }
Izhod: