In Java , Nākotne ir saskarne kas pieder java.util.concurrent iepakojums . To izmanto, lai attēlotu asinhronā aprēķina rezultātu. Interfeiss nodrošina metodes, lai pārbaudītu, vai aprēķins ir pabeigts, gaidīt tā pabeigšanu un izgūt aprēķina rezultātu. Kad uzdevums vai aprēķins ir pabeigts, aprēķinu nevar atcelt.
Sintakse:
public interface Future
Java nākotnes piemērs
Labākais Java Future piemērs ir Izpildītāja pakalpojums saskarne. Tas rada nākotnes objektu (no dažām to metodēm) viena vai vairāku asinhrono uzdevumu progresa izsekošanai.
Nākotnes saskarnes metodes
Saskarne nodrošina šādas piecas metodes:
Metode | Apraksts |
---|---|
atcelt () | Tas mēģina atcelt uzdevuma izpildi. |
gūt() | Metode, ja nepieciešams, gaida, līdz aprēķins tiks pabeigts, un pēc tam izgūst tā rezultātu. |
gūt() | Ja nepieciešams, gaida ne ilgāk kā norādīto laiku, līdz aprēķins tiks pabeigts, un pēc tam izgūst tā rezultātu, ja tas ir pieejams. |
ir atcelts () | Tas atgriežas ar patiesu vērtību, ja uzdevums tika atcelts pirms tā pabeigšanas. |
ir Gatavs () | Tas atgriežas patiess, ja uzdevums ir pabeigts. |
Nākotnes saskarnē bija daži trūkumi, kas ir šādi:
- Izmantojot Future, aprēķinu nevar pabeigt manuāli.
- Tas nepaziņo, kad komutācija ir pabeigta.
- Tās ķēdi nevar izveidot un apvienot.
Lai pārvarētu iepriekš minētos ierobežojumus, Java 8 ieviests CompletableFuture .
Nākotnes izmantošana asinhronajā programmēšanā
Rezultāta iegūšana
Kā mēs jau iepriekš apspriedām, nākotne ir asinhrona uzdevuma rezultāts. Lai izgūtu šī asinhronā uzdevuma rezultātu, Java Future saskarne nodrošina šādas divas get() metožu versijas, kas abas atgriež objektu. Ņemiet vērā, ka atgriešanas veids var būt vispārīgs veids. Piemēram:
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(); }
Piezīme. Ja mēģināsim izsaukt metodi get() pirms asinhronā uzdevuma pabeigšanas, metode get() tiks bloķēta, līdz rezultāts būs gatavs.
Lai novērstu iepriekš minēto trūkumu, Future interfeiss nodrošina citu get() metodes versiju, kas izslēdz laiks (milisekundēs) kā parametrs. Tas nozīmē, ka Nākotne gaidīs noteiktu laiku, lai pabeigtu uzdevumu pēc tam, kad rezultāts būs pieejams Nākotnē. Piemēram:
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. }
Ja Future nesaņem nekādu rezultātu norādītajā laikā, a TimeoutException izmet Nākotne.
Atceliet asinhrono uzdevumu
Mēs varam arī atcelt asinhrono uzdevumu jebkurā brīdī, zvanot uz atcelt () nākotnes saskarnes metode. Piemēram:
Future future = ... // Get Future from somewhere future.cancel();
Pārbaudiet, vai asinhronais uzdevums ir paveikts
Interfeiss nodrošina metodi ir Gatavs () lai pārbaudītu, vai asinhronais uzdevums ir pabeigts. Piemēram:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Pārbaudiet, vai asinhronais uzdevums ir atcelts
Nākotnes saskarne nodrošina metodi ir atcelts () lai pārbaudītu, vai Future attēlotais asinhronais uzdevums ir vai nav atcelts. Tas atgriež patiesu, ja uzdevums ir veiksmīgi atcelts, pretējā gadījumā atgriež false. Piemēram:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Java nākotnes piemērs
NākotnesPiemērs.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(); } }
Izvade: