Одна проблема с использованием прерывания состоит в том, что , если вы не контролируете весь код, выполняемый , вы рискуете, что прерывание не будет работать "должным образом" из-за чьего-либо нарушения понимания того, как обрабатывать прерывания в своей библиотеке. То есть API невидимо экспортирует API вокруг своей обработки interrupt
s, от которой вы становитесь зависимыми.
В вашем примере предположим, что doSomeWork
был в стороннем JAR и выглядит так:
public void doSomeWork() {
try {
api.callAndWaitAnswer() ;
}
catch (InterruptedException e) { throw new AssertionError(); }
}
Теперь вам нужно обработать AssertionError
(или что-то еще, что может использовать библиотека, которую вы используете). Я видел, как опытные разработчики бросали всякую чепуху при получении прерываний! С другой стороны, возможно, метод выглядел так:
public void doSomeWork() {
while (true) {
try {
return api.callAndWaitAnswer() ;
}
catch (InterruptedException e) { /* retry! */ }
}
}
Эта "неправильная обработка" прерывания заставляет вашу программу зацикливаться бесконечно. Опять же, не отклоняйте это как смешное; Есть много сломанных механизмов обработки прерываний.
По крайней мере, использование собственного флага будет совершенно невидимым для любых сторонних библиотек.