Sobes.tech
Middle

Jaka jest różnica między metodami interrupted() a isInterrupted() w Java?

sobes.tech AI

Odpowiedź od AI

isInterrupted() sprawdza, czy bieżący wątek ma ustawiony flagę przerwania, nie resetując jej.

interrupted() sprawdza, czy bieżący wątek ma ustawiony flagę przerwania, i resetuje ją po sprawdzeniu, jeśli była ustawiona. Ta metoda jest static.

Przykład:

// Tworzymy wątek
Thread t = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        // Wykonuj przydatną pracę
    }
    System.out.println("Wątek przerwany.");
});

// Uruchamiamy wątek
t.start();

// Przerywamy wątek
t.interrupt();

// Sprawdzamy stan flagi po interrupt() za pomocą isInterrupted()
System.out.println("isInterrupted() po interrupt(): " + t.isInterrupted()); // Powinno być true

try {
    // Czekamy na zakończenie wątku (w tym przypadku szybko się zakończy)
    t.join();
} catch (InterruptedException e) {
    // Przywracamy flagę przerwania, jeśli join() zostało przerwane
    Thread.currentThread().interrupt();
}

// Sprawdzamy stan flagi po interrupt() za pomocą interrupted() (z innego wątku!)
// Uwaga: wywołanie interrupted() z innego wątku nie ma sensu,
// ponieważ działa ona na flagę bieżącego wątku.
// Aby pokazać działanie interrupted(), trzeba wywołać ją z samego przerwanego wątku.

// Przykład wywołania interrupted() w innym wątku (nie ma to związku z wątkiem t)
System.out.println("interrupted() z bieżącego wątku: " + Thread.interrupted()); // Powinno być false (jeśli wątek nie był przerwany)

Kluczowa różnica:

Metoda Flaga przerwania jest resetowana? Typ metody
isInterrupted() Nie Instancja
interrupted() Tak Statyczna