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() |
Да | Статичен |