V Java multithreading umožňuje súbežné spustenie úloh, čím sa zlepšuje výkon a odozva. Vývojári tradične používali na definovanie úloh rozhranie Runnable, ale má dve hlavné obmedzenia: nemôže vrátiť výsledok a nemôže vyvolať začiarknuté výnimky. Na prekonanie týchto javov Java zaviedla rozhrania Callable a Future v jazyku Java 5.
Volateľné rozhranie
The Volateľné rozhranie predstavuje úlohu, ktorá vracia výsledok a môže vyvolať výnimku. Je to podobné ako Runnable, ale flexibilnejšie, pretože môže vrátiť hodnotu a vyvolať začiarknuté výnimky.
npm vyčistiť vyrovnávaciu pamäťJava
import 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(); } }
Výstup
Result: 15
Vysvetlenie: Realizátorovi sa odošle výzva, ktorú možno vyhlásiť. Vypočíta súčet čísel od 1 do 5 a vráti výsledok. Výsledok sa získa pomocou future.get() po dokončení úlohy.
Budúce rozhranie
The Budúce rozhranie predstavuje výsledok asynchrónneho výpočtu. Keď odošlete Callable alebo Runnable úlohu ExecutorService, vráti budúci objekt.
rovná sa metóda javaJava
import 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(); } } }
Výstup
Result: 30
Vysvetlenie: TheCallableúloha počíta10 + 2 and ExecutorService.submit()metóda vracia aFutureobjekt. Používaniefuture.get()výsledok dostaneme po dokončení výpočtu.
Volateľné verzus budúcnosť
| Funkcia | Volateľné | Budúcnosť |
|---|---|---|
| Účel | Predstavuje úlohu, ktorá vráti výsledok | Predstavuje výsledok asynchrónnej úlohy |
| Typ návratu | Po vykonaní vráti výsledok | Obsahuje výsledok vrátený Callable |
| Definované v | java.util.concurrent balík | java.util.concurrent balík |
| Poprava | Odoslané ExecutorService | Vrátené ExecutorService.submit() |
| Metódy | Má jednu metódu call() | Má metódy ako get() isDone() cancel() |
| Spracovanie výnimiek | Môže vyvolať začiarknuté výnimky | Spracúva výsledky a výnimky po vykonaní |
| Použitie | Definuje, čo sa má vykonať | Ovláda monitoruje a získava výsledok úlohy |