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