Page 246 - 6253
P. 246
}catch (InterruptedException e) {
// потік перерваний під час очікування або призупинення
} finally {
виконати очистку, якщо потрібно;
}
// виходом з методу run() завершується виконання потоку
}
Перевірка стану переривання потоку викликом методу isInterrupted() не є
обов’язковою і не зручна, оскільки можна виконати виклик методу sleep() (або
інший метод переривання) після кожної ітерації циклу. Якщо метод sleep()
викликається, коли встановлено стан переривання, то потік не переходить у стан
очікування. Замість цього він очищає свій стан і генерує виняток типу
InterruptedException. Таким чином, якщо метод sleep() викликається в циклі, то
перевіряти стан переривання не має необхідності. Замість цього краще виконати
перехоплення згенерованого об’єкта винятку типу InterruptedException, як це
показано нижче.
public void run() {
try {
while (додаткові дії) {
виконати додаткові дії;
Thread.sleep(delay);
}
} catch(InterruptedException e) {
// потік перерваний під час очікування
} finally {
виконати очистку, якщо необхідно;
}
// виходом з методу run() завершується виконання потоку
}
Статичний метод interrupted() перевіряє, чи був перерваний поточний потік.
Більше того, виклик даного методу призводить до очищення стану переривання
потоку. З іншого боку, метод isInterrupted() може бути використаний для перевірки
того, чи був перерваний будь-який потік. Його виклик не призводить до зміни стану
переривання.
Можна знайти велику кількість опублікованого коду, де на нижньому рівні
245