Что выведет код Middle java.util.concurrent и виртуальные потоки обновлено

Что выведет: цепочка CompletableFuture

Вопрос

Что выведет программа (Java 21)? Каждый вывод println с новой строки.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) {
        CompletableFuture<Integer> a = CompletableFuture.supplyAsync(() -> 10);
        CompletableFuture<Integer> b = CompletableFuture.supplyAsync(() -> 5);
        int sum = a.thenCombine(b, Integer::sum).thenApply(x -> x * 2).join();
        System.out.println(sum);

        String r = CompletableFuture.supplyAsync(() -> {
                if (true) throw new IllegalStateException("bad");
                return "ok";
            })
            .thenApply(s -> s + "!")
            .exceptionally(e -> "recovered: " + e.getCause().getMessage())
            .join();
        System.out.println(r);

        CompletableFuture<String> c = CompletableFuture.supplyAsync(() -> "x")
            .thenCompose(s -> CompletableFuture.supplyAsync(() -> s + "y"));
        System.out.println(c.join());
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 30, recovered: bad, xy. thenCombine складывает 10 и 5, thenApply удваивает: 30.

Что выведет

30
recovered: bad
xy

Разбор

thenCombine складывает 10 и 5, thenApply удваивает: 30. Во второй цепочке исключение пропускает thenApply и попадает в exceptionally, причём завёрнутым в CompletionException, поэтому сообщение берут из getCause(). thenCompose склеивает два асинхронных шага без вложенного future.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме