Класс InterruptedException
Класс InterruptedException - это проверяемое
исключение из пакета java.lang, которое
возникает, когда поток находится в состоянии
ожидания, сна или блокировки, и другой поток
прерывает его с помощью метода interrupt.
Это исключение наследуется от класса Exception
и относится к категории проверяемых исключений,
поэтому его необходимо либо обработать в блоке
try-catch, либо объявить в сигнатуре метода
с помощью ключевого слова throws.
Методы, которые могут вызвать это исключение:
Thread.sleep, Object.wait,
Thread.join, Lock.lockInterruptibly
и другие блокирующие операции. Когда поток
прерывается, флаг прерывания сбрасывается,
и выбрасывается InterruptedException.
Синтаксис
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// handle interruption
}
Пример
Давайте создадим поток, который засыпает на
10 секунд, и прервём его из главного потока:
public class Main
{
public static void main(String[] args)
{
Thread worker = new Thread(() -> {
try
{
System.out.println("Worker started");
Thread.sleep(10000);
System.out.println("Worker finished");
}
catch (InterruptedException e)
{
System.out.println("Worker interrupted");
}
});
worker.start();
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
worker.interrupt();
}
}
Результат выполнения кода:
"Worker started"
"Worker interrupted"
Пример
Давайте покажем, как пробросить исключение
InterruptedException выше по стеку с помощью
ключевого слова throws:
public class Main
{
public static void main(String[] args)
{
try
{
doWork();
}
catch (InterruptedException e)
{
System.out.println("Caught: " + e.getMessage());
}
}
public static void doWork() throws InterruptedException
{
System.out.println("Working...");
Thread.sleep(5000);
System.out.println("Done");
}
}
Результат выполнения кода:
"Working..."
"Caught: sleep interrupted"
Пример
Давайте восстановим флаг прерывания после
перехвата исключения с помощью метода
interrupt, чтобы вышестоящий код знал
о прерывании:
public class Main
{
public static void main(String[] args)
{
Thread worker = new Thread(() -> {
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
System.out.println("Interrupt flag restored: "
+ Thread.currentThread().isInterrupted());
}
});
worker.start();
worker.interrupt();
}
}
Результат выполнения кода:
"Interrupt flag restored: true"