Что выведет код 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 ошибок.