Page 171 - 6571
P. 171
наприклад, викликом методу sleep(), то генерується об’єкт
виняткової ситуації типу InterruptedException.
У мові Java не існує вимоги, що перерваний потік повинен
припинити виконання. Перерваний потік може сам вирішувати,
як реагувати на переривання. Деякі потоки є настільки
важливими, що повинні виконати обробку виняткової ситуації і
продовжити своє виконання. Але найчастіше потік повинен
інтерпретувати переривання як запит на припинення свого
виконання. Метод run() такого потоку може мати наступний
вигляд:
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
виконати додаткові дії;
}
}catch (InterruptedException e) {
// потік перерваний під час очікування або призупи-
нення
} finally {
виконати очистку, якщо потрібно;
}
// виходом з методу run() завершується виконання потоку
}
Перевірка стану переривання потоку викликом методу
isInterrupted() не є обов’язковою і не зручна, оскільки
можна виконати виклик методу sleep() (або інший метод
переривання) після кожної ітерації циклу. Якщо метод sleep()
викликається, коли встановлено стан переривання, то потік не
переходить у стан очікування. Замість цього він очищає свій стан
і генерує виняток типу InterruptedException. Таким чином,
якщо метод sleep() викликається в циклі, то перевіряти стан
переривання не має необхідності. Замість цього краще виконати
перехоплення згенерованого об’єкта винятку типу
InterruptedException, як це показано нижче.
public void run() {
try {
while (додаткові дії) {
виконати додаткові дії;
Thread.sleep(delay);
170