【问题标题】:finally-block and thread suspensionfinally 块和线程挂起
【发布时间】:2013-12-25 18:56:59
【问题描述】:

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

Semaphore lock = new Semaphore(0);

try {

    lock.acquire();

} finally {

// do something

}

这种观察是否可以推广到线程的暂停,即 Oracle 文档所说的只能用来绕过 return、break 和 continue 是否属实?

Oracle 文档。说:

但 finally 不仅仅对异常处理有用——它 允许程序员避免意外清理代码 被返回、继续或中断绕过。

【问题讨论】:

    标签: java multithreading finally


    【解决方案1】:

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

    【讨论】:

    • 既然你这么说,这似乎很明显。谢谢。
    【解决方案2】:

    即使你想绕过 finally 块也是相当困难的。
    有关何时发生这种情况的更多详细信息,请查看这些示例。

    Does a finally block always run?

    What are the circumstances under which a finally {} block will NOT execute?

    【讨论】:

      【解决方案3】:

      finally 块将在 try 完成时执行。它不关心线程是否被挂起。

      【讨论】:

        猜你喜欢
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        相关资源
        最近更新 更多