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

Что выведет: invokeAll и порядок результатов

Вопрос

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

import java.util.*;
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        try (ExecutorService pool = Executors.newFixedThreadPool(3)) {
            List<Callable<String>> tasks = List.of(
                () -> { Thread.sleep(300); return "slow"; },
                () -> "fast",
                () -> { throw new IllegalArgumentException("boom"); }
            );
            List<Future<String>> fs = pool.invokeAll(tasks);
            for (Future<String> f : fs) {
                try {
                    System.out.println(f.get());
                } catch (ExecutionException e) {
                    System.out.println("error " + e.getCause().getMessage());
                }
            }
        }
    }
}

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

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

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

Коротко

Код выведет: slow, fast, error boom. invokeAll ждёт завершения всех задач и возвращает Future в том же порядке, в каком были переданы задачи, независимо от того, кто закончил раньше.

Что выведет

slow
fast
error boom

Разбор

invokeAll ждёт завершения всех задач и возвращает Future в том же порядке, в каком были переданы задачи, независимо от того, кто закончил раньше. Исключение задачи хранится в её Future и вылетает из get() как ExecutionException с исходной причиной.

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

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

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