面试题答案
一键面试在多线程的Java程序中,当一个线程在try
块中被中断(interrupt
)时,finally
块的执行时机与单线程环境下基本相同,即无论try
块是正常结束还是因异常终止,finally
块都会执行。然而,多线程环境中存在一些复杂情况,例如中断可能导致try
块提前终止。
以下是代码示例:
public class InterruptFinallyExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
System.out.println("线程开始执行try块");
for (int i = 0; i < 5; i++) {
System.out.println("执行任务: " + i);
Thread.sleep(1000);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}
} catch (InterruptedException e) {
System.out.println("线程捕获到中断异常");
} finally {
System.out.println("线程执行finally块");
}
});
thread.start();
try {
Thread.sleep(2500);
thread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上述代码中:
try
块执行任务:线程在try
块中执行任务,每次循环睡眠1秒。- 检查中断并抛出异常:每次循环时检查线程是否被中断,如果是则抛出
InterruptedException
。 catch
块处理异常:捕获InterruptedException
并打印消息。finally
块始终执行:无论try
块是正常结束还是因中断异常终止,finally
块都会执行。
可能出现的情况:
- 正常执行:如果线程没有被中断,
try
块会正常执行完毕,然后执行finally
块。 - 中断后执行:如果线程在
try
块执行过程中被中断,try
块会抛出InterruptedException
,catch
块捕获异常并处理,然后执行finally
块。
综上所述,finally
块在多线程环境下的执行时机与单线程环境基本一致,但中断操作会影响try
块的执行流程,进而影响finally
块何时开始执行。