温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Finally最终在异步还执行吗

发布时间:2026-11-10 04:59:37 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

简短结论先给出:
finally 是否执行,和“异步”没有直接关系,关键看它所在的方法/线程是否“正常结束”。

下面分情况说清楚。


1️⃣ 普通 try-finally(同步代码)

try {
    // 业务代码
} finally {
    // 一定会执行(除非 JVM 崩溃 / System.exit)
}

✅ 只要当前线程执行到 try,finally 就会执行


2️⃣ 异步(新线程)中的 finally

✅ 情况一:finally 在异步线程内部

new Thread(() -> {
    try {
        doWork();
    } finally {
        System.out.println("finally 执行");
    }
}).start();

✅ 会执行
因为 finally 属于这个异步线程自己的方法栈


❌ 情况二:finally 在“提交任务的线程”里

try {
    executor.submit(() -> {
        // 异步执行
    });
} finally {
    System.out.println("finally 执行");
}

⚠️ finally 会马上执行
但不是等异步任务结束,而是:

任务提交完就执行 finally

这是很多人误解的地方。


3️⃣ 常见误区(非常重要)

❌ 误区:finally 会等异步任务完成

try {
    CompletableFuture.runAsync(() -> {
        sleep(5秒);
    });
} finally {
    System.out.println("finally");
}

✅ 实际输出顺序:

finally
(5秒后异步任务才结束)

4️⃣ 想“等异步完成再执行 finally”?

✅ 正确做法一:在异步内部写 finally

CompletableFuture.runAsync(() -> {
    try {
        doWork();
    } finally {
        System.out.println("异步结束才执行");
    }
});

✅ 正确做法二:阻塞等待

try {
    CompletableFuture<?> f = CompletableFuture.runAsync(() -> {});
    f.join(); // 等异步完成
} finally {
    System.out.println("finally");
}

5️⃣ finally 不执行的极少数情况

  • JVM 崩溃
  • System.exit()
  • 操作系统 kill -9
  • 无限循环 / 死锁(线程永远不结束)

✅ 总结一句话

finally 跟“是不是异步”无关,只跟“它所在的方法有没有正常执行完”有关。

如果你愿意,可以把你的具体代码贴出来,我可以直接帮你判断 finally 会不会执行、什么时候执行。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手