Page 247 - 6253
P. 247
переривання типу 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()):
void myMethod() throws InterruptedException {
sleep(delay);
}
10.4. Керування життєвим циклом та синхронізація
10.4.1 Використання методів isalive() та join()
Як уже було згадано, найчастіше необхідно, щоб головний потік завершувався
останнім. У попередніх прикладах з методу main() виконувався виклик методу
sleep()із затримкою, достатньою для того щоб гарантувати, що всі дочірні потоки
завершаться раніше головного. Однак дане рішення породжує наступне питання: як
один потік може знати про завершення іншого потоку? Для цього в класі Thread
визначені відповідні методи, що дають відповідь на це питання.
Існує два способи визначити, що потік був завершений. По-перше, для будь-
якого потоку можна викликати метод isAlive(), визначений у класі Thread. Метод
246