如果我有一个函数有一个try /最后一节,而线程同时在try块,将finally块中断实际发生之前执行的运行被中断?
Answer 1:
根据Java教程 ,“如果执行线程try
或catch
码被中断或被杀, finally
块不可以,即使该应用程序作为一个整体继续执行。”
下面是完整的一段话:
在
finally
块总是执行时try
块退出。 这确保了finally
即使发生了意外的异常块被执行。 但finally
是不仅仅是异常处理更加有用-它允许程序员避免不慎被绕过有清理代码return
,continue
,或break
。 在把清理代码finally
块始终是一个很好的做法,即使没有异常的预期。注意:如果JVM退出,而
try
或catch
正在执行的代码,那么finally
块可以不执行。 同样,如果执行线程try
或catch
码被中断或被杀,finally
块不可以,即使该应用程序作为一个整体继续执行。
class Thread1 implements Runnable {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("finally executed");
}
}
}
...
t1.start();
t1.interrupt();
它打印 -最后执行
Answer 2:
Java中的线程中断只是设置一个标志。 它不会导致什么特别的情况发生,以当前正在执行的代码,或影响控制流。
如果你的线程是从事,或者试图进入,抛出InterruptedException的操作,那么异常是从哪里被调用的方法点抛出,如果它是一个try块内,最终将异常叶子就像正常的前执行。
Answer 3:
许多Oracle的Java教程是有帮助的(我有答案引用保护块页面和SAX介绍),但他们不一定是权威的,其中一些有错误或不完整。 在这个问题中引用的报价合并了与JVM退出,这是令人困惑的中断。
首先,在Java线程中断无关与操作系统级中断。 共享名称混乱创造了机会,但没有连接 。
接下来,JVM退出显然杀死线程没有机会做任何清理工作。 如果进程死掉至于最终阻塞线程已经变得之前,太糟糕了。 但目前还没有比较中断。 关于中断没有最终阻止完成块。
中断的设计原理是作用于中断需要的线程的合作中断。 自行决定线程中断响应,中断不会强迫线程做任何事情。 所有调用线程#中断()并设置该线程上的标志。 像等待或睡眠阻断方法检查标志,看他们是否应该早起。 (InterruptedException的是经过检查的异常,所以你可以告诉谁时抛出它,您可运行可以计划的。)同时,任何代码可以使用线程#isInterrupted()来检查它的线程是否有标志设置。
当线程#睡眠()承认中断标志设置,它抛出InterruptedException的前清除该标志。 当你的线程抓住一个InterruptedException这是很好的方式来恢复使用Thread.currentThread()的标志。中断(),以防万一存在这样线程需要了解中断运行的任何其他代码。 此进场时,你有地方,比如有的深度嵌套的组件可以得到它的睡眠中断嵌套同步更复杂的情况,让它留清能防止高层从寂寂中断。 在像这里其他的答案的那些简单的玩具例子,它并不重要,如果该标志恢复与否,没有再次检查,并在线程终止。
Answer 4:
在评论的答案 ,@Risadinha问起代码是否非常有效的问题finally
如果我们恢复中断内标志模块被执行catch
通过调用块Thread.currentThread().interrupt()
下面是一小段代码进行测试:
final SomeContext context = new SomeContext();
Thread thread = new Thread() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// this code gets executed even though
// we interrupt thread in catch block.
context.value = 9;
}
}
};
thread.start();
thread.interrupt();
thread.join(); // need to wait for thread code to complete
assertEquals(context.value, 9); // values are the same!
SomeContext类代码:
class SomeContext {
public volatile int value = 10;
}
Answer 5:
中断的影响是抛出一个InterruptedException
发生阻塞操作下一次(在实践中,下一次调用一个方法,它指定它可以抛出InterruptedException
),在该点-像往常一样-正常try/catch
执行流程之后,它确实执行finally
的阻止后try
以及任何适用的catch
ES。
Answer 6:
它将执行同样的方式与任何其他异常从try块,而不是中断前。