Sobes.tech
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();
}