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

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