Назад к вопросам
Middle
110
questionbank

В чем разница между методами interrupted() и isInterrupted() в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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() нужно вызвать его из самого прерванного потока.

// Пример вызова interrupted() внутри другого потока (не имеет отношения к флагу потока t)
System.out.println("interrupted() из текущего потока: " + Thread.interrupted()); // Должно быть false (если текущий поток не был прерван)

Ключевое различие:

Метод Флаг прерывания сбрасывается? Тип метода
isInterrupted() Нет Экземпляра
interrupted() Да Статический