Что выведет код Senior java.util.concurrent и виртуальные потоки обновлено
Что выведет: виртуальные потоки
Вопрос
Что выведет программа (Java 21)? Каждый вывод println с новой строки.
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
public class Main {
public static void main(String[] args) throws Exception {
AtomicInteger done = new AtomicInteger();
try (ExecutorService ex = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 10_000; i++) {
ex.submit(() -> {
Thread.sleep(10);
done.incrementAndGet();
return null;
});
}
}
System.out.println(done.get());
Thread t = Thread.ofVirtual().unstarted(() -> {});
System.out.println(t.isVirtual() + " " + t.isDaemon());
Thread p = new Thread(() -> {});
System.out.println(p.isVirtual());
}
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 10000, true true, false. close() у ExecutorService (try-with-resources) ждёт завершения всех задач, поэтому счётчик ровно 10 000, и это занимает доли секунды: 10 000 спящих виртуальных потоков не занимают потоки ОС.
Что выведет
10000
true true
false
Разбор
close() у ExecutorService (try-with-resources) ждёт завершения всех задач, поэтому счётчик ровно 10 000, и это занимает доли секунды: 10 000 спящих виртуальных потоков не занимают потоки ОС. Виртуальные потоки всегда daemon. Обычный new Thread создаёт платформенный поток.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Рекурсия в computeIfAbsent
- null в ConcurrentHashMap
- CompletableFuture без executor
- Опасность newFixedThreadPool
- CountDownLatch и CyclicBarrier