Sobes.tech
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() Ναι Στατικό