MST

星途 面试题库

面试题:Java多线程环境下finally块执行时机的特殊性

在多线程的Java程序中,一个线程执行try - catch - finally代码块,当在try块中线程被中断(interrupt)时,finally块的执行时机和单线程环境下有何不同?请结合代码分析可能出现的情况。
24.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在多线程的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();
        }
    }
}

在上述代码中:

  1. try块执行任务:线程在try块中执行任务,每次循环睡眠1秒。
  2. 检查中断并抛出异常:每次循环时检查线程是否被中断,如果是则抛出InterruptedException
  3. catch块处理异常:捕获InterruptedException并打印消息。
  4. finally块始终执行:无论try块是正常结束还是因中断异常终止,finally块都会执行。

可能出现的情况:

  1. 正常执行:如果线程没有被中断,try块会正常执行完毕,然后执行finally块。
  2. 中断后执行:如果线程在try块执行过程中被中断,try块会抛出InterruptedExceptioncatch块捕获异常并处理,然后执行finally块。

综上所述,finally块在多线程环境下的执行时机与单线程环境基本一致,但中断操作会影响try块的执行流程,进而影响finally块何时开始执行。