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