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 |