Thread.ofVirtual()
Создаёт виртуальный поток — лёгкий поток, которых можно запустить миллионы.
Доступно с: Java 21
Синтаксис
public static Thread.Builder.OfVirtual ofVirtual()
public static Thread startVirtualThread(Runnable task)Возвращаемое значение
Thread.Builder.OfVirtualПостроитель виртуальных потоков.
Примеры
Запуск виртуального потока:
void main() throws InterruptedException {
Thread t = Thread.ofVirtual().name("worker").start(() ->
IO.println(Thread.currentThread().getName() + " virtual=" + Thread.currentThread().isVirtual()));
t.join();
}Результат:
worker virtual=trueДесять тысяч потоков, каждый спит 100 мс:
void main() throws InterruptedException {
var done = new AtomicInteger();
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10_000; i++) {
threads.add(Thread.startVirtualThread(() -> {
try { Thread.sleep(100); } catch (InterruptedException e) { return; }
done.incrementAndGet();
}));
}
for (Thread t : threads) t.join();
IO.println(done.get() + " tasks finished");
}Результат:
10000 tasks finishedПримечания
Виртуальные потоки управляются JVM, а не операционной системой: пока поток ждёт (сон, сеть, файл), он не занимает системный поток. Они подходят для множества задач с ожиданием, но не ускоряют вычисления. Пулы для них не нужны — создавайте новый поток на каждую задачу, обычно через Executors.newVirtualThreadPerTaskExecutor().
См. также
- Executors.newVirtualThreadPerTaskExecutor() — Создаёт сервис, который запускает каждую задачу в отдельном виртуальном потоке.
- Thread — Поток выполнения: позволяет программе делать несколько дел одновременно.
- Thread.start() — Запускает поток: его код начинает выполняться параллельно с вызывающим.
Вопросы и ответы по теме
В учебнике
- Виртуальные потоки — Виртуальные потоки в Java 21+ — чем они отличаются от обычных, Thread.ofVirtual, newVirtualThreadPerTaskExecutor, тысячи задач сразу и ограничение через Semaphore.