Назад к вопросам
Junior
80
questionbank

Что такое исключение InterruptedException?

Sobes Copilot

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

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

sobes.tech AI

InterruptedException — это контролируемое (checked) исключение в Java, которое генерируется, когда поток ожидает, спит или занят какой-либо другой активностью, и эта активность прерывается другим потоком.

Основные моменты:

  • Наследуется от Exception.
  • Указывает, что поток, который был блокирован (например, в методах wait(), sleep(), join(), в блокирующих операциях ввода-вывода), получил запрос на прерывание.
  • При выбрасывании этого исключения поток очищает флаг прерывания.

Пример обработки:

// Пример обработки InterruptedException
public class InterruptedTask implements Runnable {
    @Override
    public void run() {
        try {
            // Поток выполняет какую-то работу, которая может быть прервана
            Thread.sleep(5000); // Пример блокирующей операции
            System.out.println("Задача завершена без прерывания.");
        } catch (InterruptedException e) {
            // Было получено прерывание
            System.out.println("Задача прервана.");
            // Можно повторно установить флаг прерывания, чтобы
            // вышестоящий код знал о прерывании
            Thread.currentThread().interrupt();
            // Дополнительная логика для выхода или очистки ресурсов
        }
    }

    public static void main(String[] args) {
        Thread worker = new Thread(new InterruptedTask());
        worker.start();

        try {
            // Ждем немного, затем прерываем поток
            Thread.sleep(1000);
            worker.interrupt(); // Прерываем поток
        } catch (InterruptedException e) {
            e.printStackTrace(); // Обработка исключения main потока
        }
    }
}

Правильная обработка InterruptedException важна для создания надежных многопоточных приложений. Типичные стратегии:

  1. Перебросить исключение дальше (throw new InterruptedException();).
  2. Повторно установить флаг прерывания (Thread.currentThread().interrupt();) и, возможно, завершить выполнение.
  3. Захватить исключение, выполнить очистку и завершить выполнение потока.