Sobes.tech
Middle

Aký je rozdiel medzi metódami interrupted() a isInterrupted() v Jave?

sobes.tech AI

Odpoveď od AI

isInterrupted() kontroluje, či má aktuálny vlákno nastavený prerušenie, bez jeho resetovania.

interrupted() kontroluje, či má aktuálne vlákno nastavený prerušenie, a ho resetuje po kontrole, ak bol nastavený. Tento spôsob je static.

Príklad:

// Vytvoríme vlákno
Thread t = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        // Vykonávame užitočnú prácu
    }
    System.out.println("Vlákno prerušené.");
});

// Spustíme vlákno
t.start();

// Prerušíme vlákno
t.interrupt();

// Skontrolujeme stav vlajky po interrupt() pomocou isInterrupted()
System.out.println("isInterrupted() po interrupt(): " + t.isInterrupted()); // malo by byť true

try {
    // Čakáme na ukončenie vlákna (v tomto prípade, rýchlo skončí)
    t.join();
} catch (InterruptedException e) {
    // Obnovíme vlajku prerušenia, ak bola join() prerušená
    Thread.currentThread().interrupt();
}

// Skontrolujeme stav vlajky po interrupt() pomocou interrupted() (z iného vlákna!)
// Pozor: volanie interrupted() z iného vlákna nemá zmysel,
// pretože pracuje s vlajkou aktuálneho vlákna.
// Pre demonštráciu fungovania interrupted() je potrebné ju volať z prerušeného vlákna.

// Príklad volania interrupted() v inom vlákne (nesúvisí s t)
System.out.println("interrupted() z aktuálneho vlákna: " + Thread.interrupted()); // malo by byť false (ak aktuálne vlákno nebolo prerušené)

Kľúčový rozdiel:

Metóda Vlajka prerušenia je resetovaná? Typ metódy
isInterrupted() Nie Inštancia
interrupted() Áno Statická