其他东西抛出的异常可以取消异步任务吗?

时间:2018-06-06 13:26:25

标签: java asynchronous exception-handling

假设我有这个异步执行某些代码的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任务成功开始执行,即使其他东西抛出异常,它仍然会完成吗?如果没有,我怎样才能在抛出异常时让异步调用完成执行?

2 个答案:

答案 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之后抛出的任何异常都不会影响该任务。

异常传播调用堆栈。调用堆栈是特定线程的本地调用。由于您的任务是异步运行的(即在另一个线程上),因此无法在另一个线程上抛出异常来影响它。