当前位置: 首页 > 知识库问答 >
问题:

中断的Java线程真的可以跳过finally子句吗?

姬存
2023-03-14

当我从Oracle Java教程中读到这篇文章时,我正在查看一个经常重复的谣言,即JVM上的守护进程线程以某种特殊的方式处理finally块(它们不会,好吗?):

注意:如果在执行trycatch代码时JVM退出,那么finally块可能不会执行。同样,如果执行trycatch代码的线程被中断或终止,则finally块可能不会执行,即使应用程序作为一个整体继续。

(重点是我的。)被打断的那一点引起了我的注意!

我认为,如果一个线程处于try/catch代码中并被中断,那么要么我们处于(或最终进入)一个状态(例如sleep,wait),在这个状态中我们最终抛出一个interruptedexception,要么我们不处于状态,我们正常或异常地退出,但在所有情况下,我们都将使用finally子句。

我错过了什么?真的有一种方法可以中断一个线程,然后跳过,同时应用程序继续运行吗?

共有1个答案

鲜于宏义
2023-03-14

因为您专门询问了守护进程线程:请记住,守护进程线程在JVM的最后一个nondaemon线程终止时就会消失,所以在这种情况下,守护进程线程可以在没有执行finally块(或者它将要执行的任何其他代码的情况下死亡,finally块没有什么特别之处)。当jvm终止时,不要使用守护进程线程来处理您不介意被丢弃在地板上的任何事情。

否则,中断对快捷方式最终块没有任何作用。中断的要点是,被中断的线程处于控制之中,可以完成它的执行,包括关闭资源,但它需要这样做。

这些教程可能很有帮助,但它们不是权威的。本例中的措辞使用了interrupted这个词,在这种情况下,假设它具体指的是线程中断似乎是合理的,这是不正确的。

 类似资料:
  • 我的手在头发上。 我正在使用Apache PDFBox,因为我想在JAVA中逐行读取pdf文件并稍后处理内容。但是我有以下问题...我在单独的java程序(在main方法中)中使用了下面的代码,它在那里工作正常。但是,当我将其与石英调度程序结合在我的tomcat服务器小程序中使用时,会出现问题,我无法找出原因。请记住,我将下面的行从工作的单独测试程序复制粘贴到我自己的更大项目中,因此它是完全相同的

  • 问题内容: 我了解到try catch语句的finally子句始终执行。但是有人对我说,有可能避免执行它(删除它不是一种选择)。 -有人怎么可能? -我也很好奇知道为什么有人要避免执行它? 问题答案: 使用该块中未捕获的异常将其杀死,或者将整个JVM杀死(这将杀死线程)。 除了不良的设计外,没有充分的理由停止执行块。如果不应该每次都运行它,则不要将其放在一个块中。 使用下面的测试代码,我运行了两种

  • 本文向大家介绍详解Java异常处理中finally子句的运用,包括了详解Java异常处理中finally子句的运用的使用技巧和注意事项,需要的朋友参考一下 当异常被抛出,通常方法的执行将作一个陡峭的非线性的转向。依赖于方法是怎样编码的,异常甚至可以导致方法过早返回。这在一些方法中是一个问题。例如,如果一个方法打开一个文件项并关闭,然后退出,你不希望关闭文件的代码被异常处理机制旁路。finally关

  • 更新:显然这个特性现在计划在dplyr上使用,正如这里讨论的:https://github.com/tidyverse/dplyr/pull/6145 在SQL中,当验证了给定的情况时,可以分配多个变量,比如var1和var2,构造如下 条件then var1 = x,var2 = y时的情况 dplyr::case_when(或tidyverse中的其他任何东西)是否支持这个有用的功能),如果是

  • 问题内容: 在大学里有关Java的问题中,有以下代码片段: 我被要求提供其输出。我回答了,但是正确答案是。为什么会这样呢?我只是不明白MyExc2去哪了。 问题答案: 通过阅读你的答案并了解你可能的想法,我相信你认为“进行中的例外”具有“优先权”。记住: 当一个新的异常被抛出到一个catch块或将要传播到该块之外的finally块中时,当新的异常向外传播时,当前异常将被中止(并被遗忘)。与其他任何

  • 问题内容: 有什么方法可以等待线程终止,但仍然拦截信号吗? 考虑以下 C 程序: 一秒钟后结束并打印: 相反,这是我尝试用 Python 编写的尝试: 它打印: 如何使其表现像C版本? 问题答案: Jarret Hardie已经提到过:根据Guido van Rossum的 说法,到目前为止,还没有更好的方法:如文档中所述,块(这意味着没有信号)。另一种选择- 超时(大约)时进行调用并进行检查看起