logo

Java budući primjer

U Java , Budućnost je sučelje koji pripada java.util.concurrent paket . Koristi se za predstavljanje rezultata asinkronog izračuna. Sučelje pruža metode za provjeru je li izračunavanje dovršeno ili nije, za čekanje njegovog završetka i dohvaćanje rezultata izračuna. Nakon što je zadatak ili izračun dovršen, ne može se poništiti izračun.

Sintaksa:

 public interface Future 

Primjer Java budućnosti

Najbolji primjer Java Future je IzvršiteljService sučelje. Proizvodi Future (od nekih njihovih metoda) objekt za praćenje napredovanja jednog ili više asinkronih zadataka.

Metode sučelja budućnosti

Sučelje nudi sljedećih pet metoda:

metoda Opis
otkazati() Pokušava poništiti izvršenje zadatka.
dobiti() Metoda čeka ako je potrebno da se izračun završi, a zatim dohvaća svoj rezultat.
dobiti() Čeka ako je potrebno, najviše zadano vrijeme da se izračun završi, a zatim dohvaća njegov rezultat, ako je dostupan.
isCancelled() Vraća true ako je zadatak otkazan prije završetka.
Gotovo je() Vraća true ako je zadatak dovršen.

Postojali su neki nedostaci Future sučelja koji su sljedeći:

  • Koristeći Future, izračun se ne može dovršiti ručno.
  • Ne šalje obavijest kada je komutacija dovršena.
  • Njegov se lanac ne može stvoriti i kombinirati.

Kako bi se prevladala gornja ograničenja, Java 8 uveo CompletableFuture .

Korištenje budućnosti u asinkronom programiranju

Dobivanje rezultata

Kao što smo već spomenuli, budućnost predstavlja rezultat asinkronog zadatka. Kako bi se dohvatio rezultat tog asinkronog zadatka, sučelje Java Future pruža sljedeće dvije verzije metoda get(), obje vraćaju objekt. Imajte na umu da tip povrata može biti generički tip. Na primjer:

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

Napomena: Ako pokušamo pozvati metodu get() prije dovršetka asinkronog zadatka, metoda get() će blokirati dok rezultat ne bude spreman.

Kako bi se prevladao gornji nedostatak, sučelje Future nudi drugu verziju get() metode koja izuzima količinu vrijeme (u milisekundama) kao parametar. To predstavlja da će Budućnost čekati neko vrijeme da dovrši zadatak nakon što taj rezultat bude dostupan u Budućnosti. Na primjer:

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

Ako Future ne dobije nikakav rezultat unutar navedenog vremena, a TimeoutException baca Budućnost.

Otkažite asinkroni zadatak

Također možemo otkazati asinkroni zadatak u bilo kojem trenutku pozivom otkazati() metoda Future sučelja. Na primjer:

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

Provjerite je li asinkroni zadatak gotov

Sučelje pruža metodu Gotovo je() kako biste provjerili je li asinkroni zadatak dovršen ili nije. Na primjer:

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

Provjerite je li asinkroni zadatak otkazan

Future sučelje pruža metodu isCancelled() kako biste provjerili je li asinkroni zadatak predstavljen Futureom otkazan ili ne. Vraća true ako je zadatak uspješno otkazan, inače vraća false. Na primjer:

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

Primjer Java budućnosti

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

Izlaz:

Java budući primjer