V Javě multithreading umožňuje souběžné spouštění úloh, což zlepšuje výkon a odezvu. Vývojáři tradičně používali k definování úloh rozhraní Runnable, ale to má dvě hlavní omezení: nemůže vrátit výsledek a nemůže vyvolat zaškrtnuté výjimky. K překonání těchto problémů Java představila rozhraní Callable a Future v Javě 5.
Volitelné rozhraní
The Volitelné rozhraní představuje úlohu, která vrací výsledek a může vyvolat výjimku. Je podobný Runnable, ale je flexibilnější, protože může vrátit hodnotu a vyvolat zaškrtnuté výjimky.
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(); } }
Výstup
Result: 15
Vysvětlení: Vyvolatelný úkol je předložen exekutorovi. Vypočítá součet čísel od 1 do 5 a vrátí výsledek. Výsledek je načten pomocí future.get() po dokončení úlohy.
Budoucí rozhraní
The Budoucí rozhraní představuje výsledek asynchronního výpočtu. Když do ExecutorService odešlete úlohu Callable nebo Runnable, vrátí 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(); } } }
Výstup
Result: 30
Vysvětlení: TheCallableúkol počítá10 + 2 and ExecutorService.submit()metoda vrací aFutureobjekt. Použitífuture.get()výsledek dostaneme po dokončení výpočtu.
Volatelná vs budoucnost
| Funkce | Volatelné | Budoucnost |
|---|---|---|
| Účel | Představuje úkol, který vrací výsledek | Představuje výsledek asynchronní úlohy |
| Typ návratu | Po provedení vrátí výsledek | Obsahuje výsledek vrácený Callable |
| Definováno v | java.util.concurrent balíček | java.util.concurrent balíček |
| Provedení | Odesláno ExecutorService | Vráceno ExecutorService.submit() |
| Metody | Má jednu metodu call() | Má metody jako get() isDone() cancel() |
| Zpracování výjimek | Může vyvolat zaškrtnuté výjimky | Zpracovává výsledky a výjimky po provedení |
| Používání | Definuje, co se má provést | Ovládá monitoruje a načítá výsledek úkolu |