Page 239 - 6571
P. 239
Але якщо потік заблокований, то перевірити стан його пере-
ривання не можливо, проте можна використати згенерований ви-
няток типу InterruptedException. Метод run() такого по-
току може мати наступний вигляд:
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
// TODO: Код, який має бути виконаний в потоці
Thread.sleep(5000);
}
} catch (InterruptedException e) {
// TODO: Код, який має бути виконаний у випадку
якщо
// потік перерваний через виклик методу sleep()
Thread.currentThread().interrupt();
}
}
У мові Java не існує вимоги, що перерваний потік повинен
припинити виконання. Перерваний потік може сам вирішувати,
як реагувати на переривання. Деякі потоки є настільки важливи-
ми, що повинні виконати обробку виняткової ситуації і продов-
жити своє виконання. Але найчастіше потік повинен інтерпрету-
вати переривання як запит на припинення свого виконання.
Досить часто необхідно, щоб головний потік завершувався
останнім. Існує два способи визначити, що потік був завершений.
По-перше, для будь-якого потоку можна викликати метод isA
ive(), визначений у класі Thread. Метод isAlive() повер-
тає значення true, якщо потік, для якого він був викликаний, ще
виконується. В іншому випадку він поверне значення false.
По-друге, в класі Thread визначено метод join(), який
очікує завершення потоку, для якого він був викликаний. Пере-
вантажені форми методу join() дозволяють вказувати макси-
мальний проміжок часу, який інший потік буде чекати завершен-
ня зазначеного потоку.
Thread mainthrd = Thread.currentThread();
Thread thrd1 = new Thread(
new MyThread(mainthrd), "Thread #1");
Thread thrd2 = new Thread(
238