Распространение исключения в CompletableFuture (java) - PullRequest
1 голос
/ 04 августа 2020

Как я могу передать исключение, обнаруженное в следующем коде внутри CompletableFuture.runAsync, в мой основной поток? Я хочу поймать IllegalStateException в основном потоке.

CompletableFuture.runAsync(() -> {
        // some business logic which needs to run indefinitely
}).exceptionally(ex -> {
    // ex.printStackTrace();
    throw new IllegalStateException("Failed to process", ex);
});

1 Ответ

1 голос
/ 04 августа 2020

Один из вариантов - создать Collection из Throwable объектов, и когда CompletableFuture завершится, вы можете добавить исключение в коллекцию (если оно не равно нулю). Затем в своем основном потоке вы можете опросить эту коллекцию.

        Set<Throwable> exception = new CopyOnWriteArraySet<>();

        CompletableFuture.runAsync(() -> {

        }).whenComplete((method, e) -> exception.add(e));

Другой вариант - использовать whenComplete с ExecutorService. Это может не сработать, если вы не используете ExecutorService. Идея состоит в том, что whenComplete вернется на mainThread ExecutorService.

        ExecutorService mainThread = Executors.newSingleThreadExecutor();
        
        CompletableFuture.runAsync(() -> {

        }).whenCompleteAsync((method, throwable) -> {
            // throw or handle in some way on main thread
        }, mainThread);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...