假设我有这个异步执行某些代码的Java代码:
public String main() {
try {
// Code before that could throw Exceptions
CompletableFuture.runAsync(() -> {...});
// Code after that could throw Exceptions
} catch (SomeException e) {
// ...
} catch (CompletionException e) {
// ...
}
}
如果要运行并且Async任务成功开始执行,即使其他东西抛出异常,它仍然会完成吗?如果没有,我怎样才能在抛出异常时让异步调用完成执行?
答案 0 :(得分:2)
如果要运行并且Async任务成功开始执行,即使其他东西抛出异常,它是否仍会完成?
是肯定的。任务没有中断。
注意:如果您的程序因异常而退出,则任务将停止。
如果没有,我怎样才能在抛出异常时让异步调用完成执行?
默认情况下会这样做。
如果要取消任务,可能会忽略中断。
public String main() {
CompletableFuture future = null;
try {
// Code before that could throw Exceptions
future = CompletableFuture.runAsync(() -> {...});
// Code after that could throw Exceptions
} catch (SomeException e) {
if (future != null) future.cancel(true);
// ...
} catch (CompletionException e) {
// ...
}
}
答案 1 :(得分:2)
只要任务已经开始,在调用runAsync
之后抛出的任何异常都不会影响该任务。
异常传播调用堆栈。调用堆栈是特定线程的本地调用。由于您的任务是异步运行的(即在另一个线程上),因此无法在另一个线程上抛出异常来影响它。