Метод newVirtualThreadPerTaskExecutor
Метод newVirtualThreadPerTaskExecutor класса Executors создает и возвращает объект ExecutorService, который для каждой переданной задачи создает отдельную виртуальную нить. Виртуальные нити - это легковесные нити, появившиеся в Java 21, которые позволяют запускать миллионы задач параллельно без выделения большого количества системных ресурсов. Метод не принимает параметров и не требует настройки пула: каждая задача получает собственную виртуальную нить, которая уничтожается после завершения задачи. Такой подход удобен для задач, связанных с ожиданием ввода-вывода, например сетевых запросов или чтения файлов.
Синтаксис
Executors.newVirtualThreadPerTaskExecutor()
Пример
Давайте создадим executor с виртуальными нитями и отправим в него несколько задач:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
for (int i = 1; i <= 3; i++) {
int taskId = i;
executor.submit(() -> {
System.out.println("Task " + taskId + " in " + Thread.currentThread());
});
}
executor.shutdown();
}
}
Результат выполнения кода может выглядеть так:
"Task 1 in VirtualThread[#21]/runnable@ForkJoinPool-1-worker-1"
"Task 2 in VirtualThread[#22]/runnable@ForkJoinPool-1-worker-2"
"Task 3 in VirtualThread[#23]/runnable@ForkJoinPool-1-worker-3"
Пример
Давайте с помощью виртуальных нитей выполним задачи, возвращающие результат, и соберем результаты через Future:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main
{
public static void main(String[] args) throws Exception
{
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
List<Future<String>> futures = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
int value = i;
futures.add(executor.submit(() -> "Result " + value));
}
List<String> res = new ArrayList<>();
for (Future<String> future : futures) {
res.add(future.get());
}
System.out.println(res);
executor.shutdown();
}
}
Результат выполнения кода:
[Result 1, Result 2, Result 3, Result 4, Result 5]
Смотрите также
-
класс
ExecutorService,
который представляет собой пул для выполнения задач -
метод
submit,
который отправляет задачу на выполнение и возвращает Future -
метод
shutdown,
который корректно завершает работу executor -
класс
Executors,
который содержит фабричные методы для создания executor