logo

Callable vs Future v Javě

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.

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 

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.

Java
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 

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

FunkceVolatelnéBudoucnost
Účel Představuje úkol, který vrací výsledekPředstavuje výsledek asynchronní úlohy
Typ návratu Po provedení vrátí výsledekObsahuje výsledek vrácený Callable
Definováno v java.util.concurrent balíčekjava.util.concurrent balíček
Provedení Odesláno ExecutorServiceVráceno ExecutorService.submit()
Metody Má jednu metodu call()Má metody jako get() isDone() cancel()
Zpracování výjimek Může vyvolat zaškrtnuté výjimkyZpracovává výsledky a výjimky po provedení
Používání Definuje, co se má provéstOvládá monitoruje a načítá výsledek úkolu
Vytvořit kvíz