Sobes.tech
Middle

Jaký je rozdíl mezi metodami interrupted() a isInterrupted() v Java?

sobes.tech AI

Odpověď od AI

isInterrupted() kontroluje, zda má aktuální vlákno nastavený pruh přerušení, aniž by jej resetoval.

interrupted() kontroluje, zda má aktuální vlákno nastavený pruh přerušení, a jej po kontrole resetuje, pokud byl nastaven. Tato metoda je static.

Příklad:

// Vytvoření vlákna
Thread t = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        // Provádět užitečnou práci
    }
    System.out.println("Vlákno přerušeno.");
});

// Spuštění vlákna
t.start();

// Přerušení vlákna
t.interrupt();

// Kontrola stavu pruhu po interrupt() pomocí isInterrupted()
System.out.println("isInterrupted() po interrupt(): " + t.isInterrupted()); // mělo by být true

try {
    // Čekání na ukončení vlákna (v tomto případě rychle skončí)
    t.join();
} catch (InterruptedException e) {
    // Obnovení pruhu přerušení, pokud bylo join() přerušeno
    Thread.currentThread().interrupt();
}

// Kontrola stavu pruhu po interrupt() pomocí interrupted() (z jiného vlákna!)
// Pozor: volání interrupted() z jiného vlákna nedává smysl,
// protože pracuje s pruhou aktuálního vlákna.
// Pro demonstraci funkce interrupted() je třeba ji volat z přerušovaného vlákna.

// Příklad volání interrupted() v jiném vlákně (nesouvisí s t)
System.out.println("interrupted() z aktuálního vlákna: " + Thread.interrupted()); // mělo by být false (pokud aktuální vlákno nebylo přerušeno)

Klíčový rozdíl:

Metoda Pruh přerušení je resetován? Typ metody
isInterrupted() Ne Instance
interrupted() Ano Statická