Junior
Mi a különbség a Callable és a Runnable interfészek között?
sobes.tech MI
Válasz az MI-től
Runnable - ez egy funkcionális interfész, amely egy feladatot képvisel, amit egy szál végrehajthat. Van egy run() metódusa, amely nem fogad argumentumokat1, és nem ad vissza értéket. Olyan háttérműveletek végrehajtására használják, amelyekhez nincs szükség eredményre.
Callable - ez egy paraméterezett interfész, amely szintén egy feladatot képvisel, amit egy szál végrehajthat. Van egy call() metódusa, amely egy generikus <V> típusú értéket (bármilyen érték)2 ad vissza, és kivételt (Exception) dobhat. Olyan feladatokhoz alkalmas, ahol az eredményt használni kell.
Fő különbségek:
| Jellemző | Runnable |
Callable |
|---|---|---|
| Visszatérési érték | Nem | Igen (típus {@code <V>}) |
| Kivételek | Nem (a {@code run} metódus) | Igen (a {@code call} metódus) |
| Metódus | {@code void run()} | {@code V call() throws Exception} |
| Használat | {@code java.lang.Runnable} | {@code java.util.concurrent.Callable} |
Runnable példák:
// Runnable megvalósítása:
Runnable task = new Runnable() {
@Override
public void run() {
// Végrehajt egy műveletet eredmény nélkül
System.out.println("Runnable feladat végrehajtva");
}
};
// Szál indítása:
new Thread(task).start();
Callable példák:
// Callable megvalósítása:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Végrehajt egy műveletet és eredményt ad vissza:
return "Callable feladat eredménnyel végrehajtva";
}
};
// ExecutorService segítségével futtatás:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
try {
// Eredmény lekérése:
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}