最后阻止和线程暂停

mar*_*man 7 java multithreading finally

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

Semaphore lock = new Semaphore(0);

try {

    lock.acquire();

} finally {

// do something

}
Run Code Online (Sandbox Code Playgroud)

这种观察可以推广到线程的暂停,即Oracle文档说它只能用于绕过return,break并且continue

Oracle doc.说:

但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码.

Mal*_*olm 6

try块完成后,finally块将开始执行.由于线程没有完成执行try块,因此无法进入finally块.但这并不意味着绕过了finally块.当线程返回时它仍然会被执行lock.acquire().