Может ли исключение, выданное чем-то другим, отменить асинхронную задачу? - PullRequest
0 голосов
/ 06 июня 2018

Допустим, у меня есть этот 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 голосов
/ 06 июня 2018

Пока задача уже запущена, любые исключения, выданные после вызова runAsync, не будут влиять на эту задачу.

Исключения распространяются вверх по стеку вызовов.Стек вызовов является локальным для определенного потока.Поскольку ваша задача выполняется асинхронно (то есть в другом потоке), исключение, созданное в другом потоке, не может повлиять на нее.

0 голосов
/ 06 июня 2018

Если это запустится и задача Async успешно начнет выполняться, будет ли она завершена, даже если что-то еще вызовет исключение?

yes.Задача не прерывается.

ПРИМЕЧАНИЕ. Если ваша программа завершает работу в результате исключения, то задача будет остановлена.

Если нет, как разрешить асинхронную работу?вызов завершается, пока генерируется исключение?

Он делает это по умолчанию.

Если вы хотите отменить задачу, она может игнорировать прерывание.

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) {
        // ...
    }
}
...