Page 245 - 6253
P. 245
InterruptedException.
Статичний метод interrupted() перевіряє, чи був перерваний поточний потік.
Його виклик має певний побічний ефект, що проявляється у встановленні стану
переривання поточного потоку в логічне значення false.
Метод isInterrupted() перевіряє, чи був перерваний потік. На відміну від
статичного методу interrupted(), виклик даного методу не змінює стан переривання
потоку.
Можна виконати примусове переривання потоку, але метод
interrupt()викликатися тільки для запиту на його переривання. Коли виконується
виклик методу interrupt()з об’єкту потоку, то даний потік переводиться в стан
переривання. Для того щоб з’ясувати, чи для потоку був встановлений стан
переривання, необхідно викликати статичний метод Thread.currentThread(), який
повертає поточний потік і з нього викликати метод isInterrupted(), що повертає
булеве значення, яке характеризує стан в якому знаходиться потік:
while (!Thread.currentThread().isInterrupted()) {
виконати додаткові дії;
}
Але якщо потік заблокований, то перевірити стан його переривання не
можливо, проте можна використати згенерований виняток типу InterruptedException.
Коли метод interrupt() викликається для потоку, що був заблокований, наприклад,
викликом методу sleep(), то генерується об’єкт виняткової ситуації типу
InterruptedException.
У мові Java не існує вимоги, що перерваний потік повинен припинити
виконання. Перерваний потік може сам вирішувати, як реагувати на переривання.
Деякі потоки є настільки важливими, що повинні виконати обробку виняткової
ситуації і продовжити своє виконання. Але найчастіше потік повинен
інтерпретувати переривання як запит на припинення свого виконання. Метод run()
такого потоку може мати наступний вигляд:
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
виконати додаткові дії;
}
244