Sisään Java , Tulevaisuus on käyttöliittymä joka kuuluu java.util.concurrent paketti . Sitä käytetään edustamaan asynkronisen laskennan tulosta. Käyttöliittymä tarjoaa menetelmät tarkistaa, onko laskenta suoritettu vai ei, odottaa sen valmistumista ja hakea laskennan tulos. Kun tehtävä tai laskenta on suoritettu, laskentaa ei voi peruuttaa.
Syntaksi:
public interface Future
Esimerkki Java Futuresta
Paras esimerkki Java Futuresta on ExecutorService käyttöliittymä. Se tuottaa Future-objektin (joistakin niiden menetelmistä) yhden tai useamman asynkronisen tehtävän edistymisen seuraamiseksi.
Tulevaisuuden käyttöliittymän menetelmät
Käyttöliittymä tarjoaa seuraavat viisi tapaa:
Menetelmä | Kuvaus |
---|---|
peruuttaa() | Se yrittää peruuttaa tehtävän suorittamisen. |
saada() | Menetelmä odottaa tarvittaessa laskennan valmistumista ja hakee sitten tuloksensa. |
saada() | Odottaa tarvittaessa korkeintaan annetun ajan, kunnes laskenta on valmis, ja hakee sitten tuloksensa, jos sellainen on saatavilla. |
on peruutettu() | Palauttaa tosi, jos tehtävä peruutettiin ennen sen valmistumista. |
on tehty() | Palauttaa tosi, jos tehtävä on suoritettu. |
Future-käyttöliittymässä oli joitain puutteita, jotka ovat seuraavat:
- Futurea käytettäessä laskentaa ei voi suorittaa manuaalisesti.
- Se ei ilmoita, kun kommutointi on valmis.
- Sen ketjua ei voi luoda ja yhdistää.
Yllä olevien rajoitusten voittamiseksi, Java 8 otettu käyttöön Täydellinen tulevaisuus .
Tulevaisuuden käyttö asynkronisessa ohjelmoinnissa
Tuloksen saaminen
Kuten olemme edellä käsitelleet, Tulevaisuus edustaa asynkronisen tehtävän tulosta. Asynkronisen tehtävän tuloksen hakemiseksi Java Future -käyttöliittymä tarjoaa seuraavat kaksi get()-menetelmien versiota, jotka molemmat palauttavat objektin. Huomaa, että palautustyyppi voi olla yleinen tyyppi. Esimerkiksi:
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(); }
Huomautus: Jos yritämme kutsua get()-metodia ennen kuin asynkroninen tehtävä on valmis, get()-metodi estää, kunnes tulos on valmis.
Yllä olevan puutteen voittamiseksi Future-käyttöliittymä tarjoaa toisen version get()-menetelmästä, joka ei sisällä aika (millisekunteina) parametrina. Se edustaa sitä, että Tulevaisuus odottaa jonkin aikaa tehtävän suorittamiseen sen jälkeen, kun tulos on saatavilla Tulevaisuudessa. Esimerkiksi:
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. }
Jos Future ei saa tulosta määritetyn ajan kuluessa, a TimeoutException on tulevaisuuden heittämä.
Peruuta asynkroninen tehtävä
Voimme myös peruuttaa asynkronisen tehtävän milloin tahansa soittamalla numeroon peruuttaa() Tulevaisuuden käyttöliittymän menetelmä. Esimerkiksi:
Future future = ... // Get Future from somewhere future.cancel();
Tarkista, onko asynkroninen tehtävä tehty
Käyttöliittymä tarjoaa menetelmän on tehty() tarkistaaksesi, onko asynkroninen tehtävä suoritettu vai ei. Esimerkiksi:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Tarkista, onko asynkroninen tehtävä peruutettu
Future-käyttöliittymä tarjoaa menetelmän on peruutettu() tarkistaaksesi, onko Future:n edustama asynkroninen tehtävä peruutettu vai ei. Se palauttaa tosi, jos tehtävä peruutetaan onnistuneesti, muussa tapauksessa palauttaa epätosi. Esimerkiksi:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Esimerkki Java Futuresta
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(); } }
Lähtö: