V Javi večnitnost omogoča sočasno izvajanje nalog, kar izboljša zmogljivost in odzivnost. Tradicionalno so razvijalci uporabljali vmesnik Runnable za definiranje nalog, vendar ima dve glavni omejitvi: ne more vrniti rezultata in ne more vrniti preverjenih izjem. Za premagovanje tega je Java uvedla vmesnika Callable in Future v Javi 5.
string.format java
Klicni vmesnik
The Priklicni vmesnik predstavlja nalogo, ki vrne rezultat in lahko povzroči izjemo. Podoben je Runnable, vendar je bolj prilagodljiv, saj lahko vrne vrednost in vrže preverjene izjeme.
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
Izhod
Result: 15
Pojasnilo: Naloga, ki jo je mogoče poklicati, je predložena izvajalcu. Izračuna vsoto števil od 1 do 5 in vrne rezultat. Rezultat se pridobi z uporabo future.get() po končani nalogi.
Prihodnji vmesnik
The Prihodnji vmesnik predstavlja rezultat asinhronega računanja. Ko oddate opravilo, ki ga je mogoče klicati ali izvajati, ExecutorService, ta vrne objekt Future.
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
Izhod
Result: 30
Pojasnilo: TheCallablenaloga izračuna10 + 2 and ExecutorService.submit()metoda vrne aFuturepredmet. Uporabafuture.get()rezultat dobimo, ko je izračun končan.
Kličljivo proti prihodnosti
| Funkcija | Kličljivo | Prihodnost |
|---|---|---|
| Namen | Predstavlja nalogo, ki vrne rezultat | Predstavlja rezultat asinhrone naloge |
| Vrsta povratka | Ob izvedbi vrne rezultat | Vsebuje rezultat, ki ga vrne Callable |
| Določeno v | paket java.util.concurrent | paket java.util.concurrent |
| Izvedba | Oddano ExecutorService | Vrne ExecutorService.submit() |
| Metode | Ima eno metodo call() | Ima metode, kot je get() isDone() cancel() |
| Obravnava izjem | Lahko vrže preverjene izjeme | Obravnava rezultate in izjeme po izvedbi |
| Uporaba | Določa, kaj naj se izvede | Nadzor nadzira in pridobi rezultat naloge |