简短结论先给出:
finally 是否执行,和“异步”没有直接关系,关键看它所在的方法/线程是否“正常结束”。
下面分情况说清楚。
try-finally(同步代码)try {
// 业务代码
} finally {
// 一定会执行(除非 JVM 崩溃 / System.exit)
}
✅ 只要当前线程执行到 try,finally 就会执行
finallynew Thread(() -> {
try {
doWork();
} finally {
System.out.println("finally 执行");
}
}).start();
✅ 会执行
因为 finally 属于这个异步线程自己的方法栈
try {
executor.submit(() -> {
// 异步执行
});
} finally {
System.out.println("finally 执行");
}
⚠️ finally 会马上执行
但不是等异步任务结束,而是:
任务提交完就执行 finally
这是很多人误解的地方。
finally 会等异步任务完成try {
CompletableFuture.runAsync(() -> {
sleep(5秒);
});
} finally {
System.out.println("finally");
}
✅ 实际输出顺序:
finally
(5秒后异步任务才结束)
CompletableFuture.runAsync(() -> {
try {
doWork();
} finally {
System.out.println("异步结束才执行");
}
});
try {
CompletableFuture<?> f = CompletableFuture.runAsync(() -> {});
f.join(); // 等异步完成
} finally {
System.out.println("finally");
}
System.exit()finally 跟“是不是异步”无关,只跟“它所在的方法有没有正常执行完”有关。
如果你愿意,可以把你的具体代码贴出来,我可以直接帮你判断 finally 会不会执行、什么时候执行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。