Page 172 - 6571
P. 172
}
} catch(InterruptedException e) {
// потік перерваний під час очікування
} finally {
виконати очистку, якщо необхідно;
}
// виходом з методу run() завершується виконання потоку
}
Статичний метод interrupted() перевіряє, чи був
перерваний поточний потік. Більше того, виклик даного методу
призводить до очищення стану переривання потоку. З іншого
боку, метод isInterrupted() може бути використаний для
перевірки того, чи був перерваний будь-який потік. Його виклик
не призводить до зміни стану переривання.
Можна знайти велику кількість опублікованого коду, де на
нижньому рівні переривання типу InterruptedException
ігнорується:
void myMethod() {
try {
sleep(delay);
} catch(InterruptedException e) { } // не ігнорувати!
}
Якщо нічого цікавого в блоці catch зробити не вдається, то
на вибір залишається наступних два обґрунтованих варіанта:
1. Зробити в блоці catch виклик методу
Thread.currentThread().Interrupt(), щоб встановити стан
переривання потоку і тоді цей стан може бути перевірений у
викликаючій частині програми:
void myMethod() {
try {
sleep(delay);
} catch (InterruptedException e) {
Thread.currentThread().Interrupt();
}
}
2. Прописати throws InterruptedException в сигнатурі
методу та видалити блок try / catch, і тоді дане переривання
може бути перехоплене у викликаючій частині програми (або в
крайньому випадку в методі run()):
171