Streams Средний

Использование исполнителей виртуальных потоков для неограниченного лёгковесного параллелизма.

✕ Java 8
ExecutorService exec =
    Executors.newFixedThreadPool(10);
try {
    futures = tasks.stream()
        .map(t -> exec.submit(t))
        .toList();
} finally {
    exec.shutdown();
}
✓ Java 21+
try (var exec = Executors
        .newVirtualThreadPerTaskExecutor()) {
    var futures = tasks.stream()
        .map(exec::submit)
        .toList();
}
Заметили проблему в этом коде? Сообщите нам.
♾️

Без настройки размера

Не нужно задавать размер пула — создавать столько потоков, сколько нужно.

Лёгковесный

Виртуальные потоки используют КБ вместо МБ памяти.

🧹

Auto-closeable

try-with-resources автоматически выполняет завершение работы.

Старый подход
Фиксированный пул потоков
Современный подход
Virtual-Thread-Executor
Начиная с JDK
21
Сложность
Средний
Исполнитель виртуальных потоков
Доступно

Широко доступно с JDK 21 LTS (сент. 2023)

Исполнитель виртуальных потоков создаёт новый виртуальный поток для каждой задачи. Не нужно задавать размер пула — виртуальные потоки достаточно дёшевы, чтобы создавать их миллионами.