最后阻止和线程暂停

时间:2013-12-25 18:57:00

标签: java multithreading finally

我注意到在Java中,如果当前线程在try-block中暂停,则相应的finally块不会被执行,例如

Semaphore lock = new Semaphore(0);

try {

    lock.acquire();

} finally {

// do something

}

这种观察是否可以推广到线程的暂停,即Oracle文档说它只能用于绕过returnbreakcontinue

Oracle doc。表示:

  

但最终不仅仅是异常处理 - 它有用   允许程序员避免意外清理代码   通过返回,继续或休息绕过。

3 个答案:

答案 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块将被执行。它并不关心线程是否被暂停。