Skip to content

2. прерывания


проверка флага interrupted через метод isInterrupted()

устанавливается через метод interrupt()

пример

https://gitlab.com/synergy9980417/razdel2/2_2


Прерывания в Java — это механизм, позволяющий управлять выполнением потоков. С помощью прерываний можно сигнализировать потоку о том, что ему следует завершить свою работу. Это особенно полезно, когда нужно остановить поток, который может выполнять длительные операции или блокирующие вызовы.

Зачем нужны прерывания?

  1. Управление потоками: Позволяют контролировать выполнение потоков, особенно в многопоточных приложениях.
  2. Остановка длительных операций: Если поток выполняет долгую задачу, можно прервать его выполнение, чтобы освободить ресурсы.
  3. Корректное завершение: Прерывания позволяют корректно завершить поток, освобождая ресурсы и завершая операции.

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

  • interrupt(): Метод, который устанавливает флаг прерывания для потока.
  • isInterrupted(): Метод, который проверяет, был ли поток прерван.
  • interrupted(): Статический метод, который проверяет, был ли текущий поток прерван и сбрасывает флаг прерывания.

Пример использования

class MyThread extends Thread {
    public void run() {
        try {
            while (!isInterrupted()) {
                // Выполняем какую-то длительную операцию
                System.out.println("Работа потока...");
                Thread.sleep(1000); // Эмуляция работы
            }
        } catch (InterruptedException e) {
            // Обработка прерывания (например, если поток был прерван во время сна)
            System.out.println("Поток был прерван!");
        } finally {
            // Очистка ресурсов или завершающие действия
            System.out.println("Завершение работы потока.");
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread thread = new MyThread();
        thread.start();

        // Ждем 5 секунд
        Thread.sleep(5000);

        // Прерываем поток
        thread.interrupt();

        // Ждем завершения потока
        thread.join();

        System.out.println("Главный поток завершён.");
    }
}

Объяснение примера

  1. Создание потока: Мы создаем класс MyThread, который наследует Thread и переопределяет метод run().
  2. Цикл выполнения: Внутри метода run() мы запускаем цикл, который выполняется до тех пор, пока поток не будет прерван (проверяем с помощью isInterrupted()).
  3. Сон потока: Используем Thread.sleep(1000), чтобы эмулировать длительную работу.
  4. Обработка прерывания: Если поток прерывается во время сна, выбрасывается исключение InterruptedException, которое мы обрабатываем.
  5. Прерывание потока: В главном методе мы создаем и запускаем поток, а затем ждем 5 секунд перед его прерыванием.
  6. Завершение: После вызова interrupt() поток корректно завершает свою работу.

Таким образом, прерывания позволяют эффективно управлять потоками и их завершением в Java.