Ваще-блок и нить подвеска
Я заметил, что в Java, если текущий поток приостановлен в блоке try, соответствующий блок finally не выполняется, например, в
Semaphore lock = new Semaphore(0);
try {
lock.acquire();
} finally {
// do something
}
Может ли это наблюдение быть обобщено на приостановку потоков, т. Е. Верно ли то, что в документе Oracle сказано, что его можно использовать только для обхода return
, break
а также continue
?
Oracle Doc. говорит:
Но, наконец, полезно не только для обработки исключений, но и позволяет программисту избежать случайного обхода кода очистки при возврате, продолжении или разрыве.
3 ответа
Блок finally начнет выполняться после завершения блока try. Поскольку поток не завершил выполнение блока try, он не может войти в блок finally. Это не значит, что блок finally обойден. Он все равно будет выполнен, когда поток вернется из lock.acquire()
,
Довольно сложно обойти блок finally, даже если вы этого хотите.
Для более подробной информации о том, когда это может произойти, проверьте их, например.
Всегда ли работает блок finally?
При каких обстоятельствах блок finally {} НЕ будет выполнен?
finally
блок будет выполнен, когда try
отделки. Неважно, приостановлена нить или нет.