Что выведет код 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 ошибок.
Предыдущий вопрос
Work stealing в ForkJoinPool
Следующий вопрос
Задача и инструмент java.util.concurrent
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Рекурсия в computeIfAbsent
- null в ConcurrentHashMap
- CompletableFuture без executor
- Опасность newFixedThreadPool
- CountDownLatch и CyclicBarrier