Junior
Jaký je rozdíl mezi rozhraními Callable a Runnable?
sobes.tech AI
Odpověď od AI
Runnable - je funkční rozhraní, které představuje úkol, jejž může spustit vlákno. Má metodu run(), která nepřijímá argumenty1 a nevrací žádnou hodnotu. Používá se k provádění operací na pozadí, které nevyžadují výsledek.
Callable - je parametrizované rozhraní, které také představuje úkol, jejž může spustit vlákno. Má metodu call(), která vrací generický typ <V> (libovolnou hodnotu)2 a může vyhodit výjimku (Exception). Je vhodné pro úkoly, jejichž výsledek je třeba použít.
Hlavní rozdíly:
| Vlastnost | Runnable |
Callable |
|---|---|---|
| Návratová hodnota | Ne | Ano (typ {@code <V>}) |
| Výjimky | Ne (metoda {@code run}) | Ano (metoda {@code call}) |
| Metoda | {@code void run()} | {@code V call() throws Exception} |
| Použití | {@code java.lang.Runnable} | {@code java.util.concurrent.Callable} |
Příklad použití Runnable:
// Implementace Runnable:
Runnable task = new Runnable() {
@Override
public void run() {
// Provádí operaci bez návratu výsledku
System.out.println("Runnable úkol proveden");
}
};
// Spuštění v vlákně:
new Thread(task).start();
Příklad použití Callable:
// Implementace Callable:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Provádí operaci a vrací výsledek:
return "Callable úkol proveden s výsledkem";
}
};
// Spuštění pomocí ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
try {
// Získání výsledku:
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}