В Эффективном Java (страница 275) существует этот сегмент кода:
...
for (int i = 0; i < concurrency; i++) {
executor.execute(new Runnable() {
public void run() {
ready.countDown();
try {
start.await();
action.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
done.countDown();
}
}
}
...
Что проку от ловли прерванного исключения только, чтобы повторно повысить его? Почему не просто позволяют ему полететь?
Простой ответ заключается в том, что InterruptedException
- это проверенное исключение, и его нет в сигнатуре метода Runnable.run
(или ] Executable.execute ()
метод). Так что вы должны это поймать. И как только вы его поймаете, рекомендуется вызвать Thread.interrupt ()
для установки флага прерывания ... если вы действительно не собираетесь подавлять прерывание.
Исполнитель может прерывать задачи, если они отменены, но он сбрасывает флаг прерывания между задачами, чтобы избежать прерывания одной отмененной задачей несвязанной задачи.
Таким образом, прерывание текущего потока здесь будет означать опасно, если он действительно что-то сделал.
Более простой способ обойти это - использовать Callable или игнорировать прерывание.
Кроме того, неплохо перехватить и зарегистрировать любую ошибку или исключение, выданное в блоке try / catch, иначе ошибка исключение / ошибка будут отброшены, и ваша программа может дать сбой, но вы не узнаете, что это такое и почему.
Иногда исключение нельзя игнорировать, и его необходимо перехватить. В основном это происходит, когда вы переопределяете метод, который не может генерировать InterruptedException
в соответствии с его сигнатурой. Например, этот подход обычно используется в методе Runnable.run ()
.