2. прерывания
проверка флага interrupted через метод isInterrupted()
устанавливается через метод interrupt()
пример
https://gitlab.com/synergy9980417/razdel2/2_2
Прерывания в Java — это механизм, позволяющий управлять выполнением потоков. С помощью прерываний можно сигнализировать потоку о том, что ему следует завершить свою работу. Это особенно полезно, когда нужно остановить поток, который может выполнять длительные операции или блокирующие вызовы.
Зачем нужны прерывания?
- Управление потоками: Позволяют контролировать выполнение потоков, особенно в многопоточных приложениях.
- Остановка длительных операций: Если поток выполняет долгую задачу, можно прервать его выполнение, чтобы освободить ресурсы.
- Корректное завершение: Прерывания позволяют корректно завершить поток, освобождая ресурсы и завершая операции.
Основные методы
- 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("Главный поток завершён.");
}
}
Объяснение примера
- Создание потока: Мы создаем класс MyThread, который наследует Thread и переопределяет метод run().
- Цикл выполнения: Внутри метода run() мы запускаем цикл, который выполняется до тех пор, пока поток не будет прерван (проверяем с помощью isInterrupted()).
- Сон потока: Используем Thread.sleep(1000), чтобы эмулировать длительную работу.
- Обработка прерывания: Если поток прерывается во время сна, выбрасывается исключение InterruptedException, которое мы обрабатываем.
- Прерывание потока: В главном методе мы создаем и запускаем поток, а затем ждем 5 секунд перед его прерыванием.
- Завершение: После вызова interrupt() поток корректно завершает свою работу.
Таким образом, прерывания позволяют эффективно управлять потоками и их завершением в Java.