Junior
Jaka jest różnica między interfejsami Callable i Runnable?
sobes.tech AI
Odpowiedź od AI
Runnable - to funkcjonalny interfejs reprezentujący zadanie, które może być wykonane przez wątek. Posiada metodę run(), która nie przyjmuje argumentów1 i nie zwraca wartości. Używany jest do wykonywania operacji w tle, które nie wymagają wyniku.
Callable - to sparametryzowany interfejs, który również reprezentuje zadanie, które może być wykonane przez wątek. Posiada metodę call(), która zwraca typ generyczny <V> (dowolną wartość)2 i może rzucać wyjątek (Exception). Nadaje się do zadań, których wynik musi być użyty.
Główne różnice:
| Cecha | Runnable |
Callable |
|---|---|---|
| Wartość zwracana | Nie | Tak (typ {@code <V>}) |
| Wyjątki | Nie (metoda {@code run}) | Tak (metoda {@code call}) |
| Metoda | {@code void run()} | {@code V call() throws Exception} |
| Użycie | {@code java.lang.Runnable} | {@code java.util.concurrent.Callable} |
Przykład użycia Runnable:
// Implementacja Runnable:
Runnable task = new Runnable() {
@Override
public void run() {
// Wykonuje jakąś operację bez zwracania wyniku
System.out.println("Zadanie Runnable wykonane");
}
};
// Uruchom w wątku:
new Thread(task).start();
Przykład użycia Callable:
// Implementacja Callable:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Wykonuje operację i zwraca wynik:
return "Zadanie Callable wykonane z wynikiem";
}
};
// Uruchom za pomocą ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
try {
// Pobierz wynik:
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}