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