Класс VirtualThread
Класс VirtualThread представляет собой
виртуальный поток - легковесный поток, который
управляется виртуальной машиной Java, а не
напрямую операционной системой. Виртуальные
потоки позволяют создавать десятки и сотни
тысяч потоков одновременно без существенных
затрат ресурсов. Класс наследуется от
Thread и был добавлен в Java 21 в
рамках проекта Loom. Для создания виртуального
потока обычно используются статические методы
Thread.startVirtualThread или
Thread.ofVirtual. В первый параметр
метода startVirtualThread мы передаем
задачу в виде Runnable, а метод
ofVirtual возвращает builder для
гибкой настройки виртуального потока.
Синтаксис
Thread.startVirtualThread(Runnable task)
Thread.ofVirtual().name(String name).start(Runnable task)
Thread.ofVirtual().unstarted(Runnable task)
Пример
Давайте создадим виртуальный поток с помощью
метода Thread.startVirtualThread и
выведем сообщение из него:
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Thread thread = Thread.startVirtualThread(() -> {
System.out.println("Hello from virtual thread");
});
thread.join();
System.out.println("Main thread finished");
}
}
Результат выполнения кода:
"Hello from virtual thread"
"Main thread finished"
Пример
Давайте создадим виртуальный поток с именем
через builder Thread.ofVirtual и
проверим, является ли поток виртуальным:
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Thread thread = Thread.ofVirtual()
.name("my-virtual-thread")
.start(() -> {
System.out.println("Running in virtual thread");
});
thread.join();
System.out.println("Name: " + thread.getName());
System.out.println("Is virtual: " + thread.isVirtual());
}
}
Результат выполнения кода:
"Running in virtual thread"
"Name: my-virtual-thread"
"Is virtual: true"
Пример
Давайте запустим несколько виртуальных потоков и соберем результаты их работы в список:
import java.util.ArrayList;
import java.util.List;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
List<String> res = new ArrayList<>();
List<Thread> threads = new ArrayList<>();
for (int i = 1; i <= 5; i++)
{
int num = i;
Thread t = Thread.ofVirtual()
.name("vt-" + num)
.start(() -> {
synchronized (res)
{
res.add("thread-" + num);
}
});
threads.add(t);
}
for (Thread t : threads)
{
t.join();
}
System.out.println(res);
}
}
Результат выполнения кода:
[thread-1, thread-2, thread-3, thread-4, thread-5]
Смотрите также
-
метод
startVirtualThread,
который запускает виртуальный поток -
метод
ofVirtual,
который возвращает builder виртуальных потоков -
метод
isVirtual,
который проверяет, является ли поток виртуальным -
класс
Thread,
который представляет обычный поток