Исполнитель виртуальных потоков
Использование исполнителей виртуальных потоков для неограниченного лёгковесного параллелизма.
Сравнение кода
✕ 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
Исполнитель виртуальных потоков
Доступно
Широко доступно с JDK 21 LTS (сент. 2023)
Как это работает
Исполнитель виртуальных потоков создаёт новый виртуальный поток для каждой задачи. Не нужно задавать размер пула — виртуальные потоки достаточно дёшевы, чтобы создавать их миллионами.
Связанная документация
Доказательство