我注意到在Java中,如果当前线程在try-block中暂停,则相应的finally块不会被执行,例如
Semaphore lock = new Semaphore(0);
try {
lock.acquire();
} finally {
// do something
}
这种观察是否可以推广到线程的暂停,即Oracle文档说它只能用于绕过return
,break
和continue
?
Oracle doc。表示:
但最终不仅仅是异常处理 - 它有用 允许程序员避免意外清理代码 通过返回,继续或休息绕过。
答案 0 :(得分:6)
当try块完成时,finally块将开始执行。由于线程没有完成执行try块,因此无法进入finally块。但这并不意味着绕过了finally块。当线程从lock.acquire()
返回时,它仍将被执行。
答案 1 :(得分:2)
即使你愿意,也很难绕过finally块。
有关何时发生这种情况的详细信息,请查看这些例如。
Does a finally block always run?
What are the circumstances under which a finally {} block will NOT execute?
答案 2 :(得分:1)
当finally
完成时,try
块将被执行。它并不关心线程是否被暂停。