Sobes.tech
Junior

Ποια είναι η διαφορά μεταξύ των διεπαφών Callable και Runnable;

sobes.tech AI

Απάντηση από AI

Runnable - είναι μια λειτουργική διεπαφή που αντιπροσωπεύει μια εργασία που μπορεί να εκτελεστεί από ένα νήμα. Έχει μια μέθοδο run(), η οποία δεν δέχεται ορίσματα1 και δεν επιστρέφει τιμές. Χρησιμοποιείται για την εκτέλεση εργασιών φόντου που δεν απαιτούν αποτέλεσμα.

Callable - είναι μια παραμετροποιημένη διεπαφή που επίσης αντιπροσωπεύει μια εργασία που μπορεί να εκτελεστεί από ένα νήμα. Έχει μια μέθοδο call(), η οποία επιστρέφει έναν γενικό τύπο <V> (τυχαία τιμή)2 και μπορεί να ρίξει μια εξαίρεση (Exception). Είναι κατάλληλη για εργασίες των οποίων το αποτέλεσμα πρέπει να χρησιμοποιηθεί.

Βασικές διαφορές:

Χαρακτηριστικό Runnable Callable
Τιμή επιστροφής Όχι Ναι (τύπος {@code <V>})
Εξαιρέσεις Όχι (μέθοδος {@code run}) Ναι (μέθοδος {@code call})
Μέθοδος {@code void run()} {@code V call() throws Exception}
Χρήση {@code java.lang.Runnable} {@code java.util.concurrent.Callable}

Παράδειγμα χρήσης του Runnable:

// Υλοποίηση του Runnable:
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Εκτελεί μια λειτουργία χωρίς να επιστρέφει αποτέλεσμα
        System.out.println("Runnable εργασία εκτελέστηκε");
    }
};

// Εκκίνηση σε νήμα:
new Thread(task).start();

Παράδειγμα χρήσης του Callable:

// Υλοποίηση του Callable:
Callable<String> task = new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Εκτελεί μια λειτουργία και επιστρέφει αποτέλεσμα:
        return "Callable εργασία εκτελέστηκε με αποτέλεσμα";
    }
};

// Εκτέλεση με ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);

try {
    // Λήψη αποτελέσματος:
    String result = future.get();
    System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}