Middle
Ποια είναι η διαφορά μεταξύ των μεθόδων interrupted() και isInterrupted() στη Java;
sobes.tech AI
Απάντηση από AI
isInterrupted() ελέγχει αν η τρέχουσα ροή έχει οριστεί η σημαία διακοπής, χωρίς να την επαναφέρει.
interrupted() ελέγχει αν η τρέχουσα ροή έχει οριστεί η σημαία διακοπής, και την επαναφέρει μετά τον έλεγχο, αν ήταν ορισμένη. Αυτή η μέθοδος είναι static.
Παράδειγμα:
// Δημιουργία ροής
Thread t = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
// Εκτέλεση χρήσιμης εργασίας
}
System.out.println("Η ροή διακόπηκε.");
});
// Εκκίνηση ροής
t.start();
// Διακοπή ροής
t.interrupt();
// Έλεγχος κατάστασης σημαίας μετά το interrupt() με isInterrupted()
System.out.println("isInterrupted() μετά το interrupt(): " + t.isInterrupted()); // πρέπει να είναι true
try {
// Αναμονή για το τέλος της ροής (σε αυτήν την περίπτωση, θα τελειώσει γρήγορα)
t.join();
} catch (InterruptedException e) {
// Επαναφορά της σημαίας διακοπής αν το join() διακοπεί
Thread.currentThread().interrupt();
}
// Έλεγχος κατάστασης σημαίας μετά το interrupt() με interrupted() (από άλλο νήμα!)
// Προσοχή: η κλήση της interrupted() από άλλο νήμα δεν έχει νόημα,
// καθώς λειτουργεί με τη σημαία του τρέχοντος νήματος.
// Για να δείξουμε πώς λειτουργεί η interrupted(), πρέπει να την καλέσουμε από το ίδιο το διακοπτόμενο νήμα.
// Παράδειγμα κλήσης της interrupted() σε άλλο νήμα (δεν σχετίζεται με το t)
System.out.println("interrupted() από το τρέχον νήμα: " + Thread.interrupted()); // πρέπει να είναι false (αν το τρέχον νήμα δεν έχει διακοπεί)
Βασική διαφορά:
| Μέθοδος | Η σημαία διακοπής επαναφέρεται; | Τύπος μεθόδου |
|---|---|---|
isInterrupted() |
Όχι | Αντικείμενο |
interrupted() |
Ναι | Στατικό |