Java multithreading leidžia užduotis vykdyti vienu metu, pagerinant našumą ir reagavimą. Tradiciškai kūrėjai naudojo Runnable sąsają užduotims apibrėžti, tačiau ji turi du pagrindinius apribojimus: ji negali grąžinti rezultato ir negali išmesti patikrintų išimčių. Norėdami įveikti šias problemas, „Java 5“ pristatė skambinamojo ir ateities sąsajas.
Skambinimo sąsaja
The Iškviečiama sąsaja reiškia užduotį, kuri pateikia rezultatą ir gali padaryti išimtį. Jis panašus į Runnable, bet lankstesnis, nes gali grąžinti reikšmę ir išmesti pažymėtas išimtis.
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(); } }
Išvestis
Result: 15
Paaiškinimas: Iškviečiama užduotis pateikiama vykdytojui. Jis apskaičiuoja skaičių nuo 1 iki 5 sumą ir grąžina rezultatą. Rezultatas gaunamas naudojant future.get(), kai užduotis baigta.
Ateities sąsaja
The Ateities sąsaja reiškia asinchroninio skaičiavimo rezultatą. Kai „ExecutorService“ pateikiate iškviečiamą arba vykdomą užduotį, ji grąžina būsimą objektą.
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(); } } }
Išvestis
Result: 30
Paaiškinimas: TheCallableužduočių skaičiavimai10 + 2 and ExecutorService.submit()metodas grąžina aFutureobjektas. Naudojantfuture.get()gausime rezultatą, kai skaičiavimas bus baigtas.
Galima skambinti prieš ateitį
| Funkcija | Galima skambinti | Ateitis |
|---|---|---|
| Tikslas | Reiškia užduotį, kuri grąžina rezultatą | Reiškia asinchroninės užduoties rezultatą |
| Grąžinimo tipas | Grąžina rezultatą, kai jis vykdomas | Saugo skambinamojo grąžintą rezultatą |
| Apibrėžiama | java.util.concurrent paketą | java.util.concurrent paketą |
| Vykdymas | Pateikta „ExecutorService“. | Grąžino ExecutorService.submit() |
| Metodai | Yra vienas metodo iškvietimas () | Yra tokie metodai kaip get() isDone() cancel() |
| Išimčių tvarkymas | Gali mesti pažymėtas išimtis | Tvarko rezultatus ir išimtis po vykdymo |
| Naudojimas | Apibrėžia, ką vykdyti | Valdo monitorius ir nuskaito užduoties rezultatą |