Сборка виртуального потока в Java
Когда одной строки startVirtualThread мало,
используют фабрику Thread.ofVirtual().
Она возвращает настраиваемый builder: можно задать
имя, получить ещё не запущенный Thread или
сразу вызвать start с задачей.
Имя помогает в логах и дампах потоков, особенно когда
виртуальных задач тысячи. Метод name принимает
строку, unstarted создаёт поток без вызова
start, start(Runnable) объединяет
создание и запуск.
Поток с заданным именем и отложенным стартом:
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread worker = Thread.ofVirtual()
.name("fetch-7")
.unstarted(() -> System.out.println(Thread.currentThread().getName()));
System.out.println("before start");
worker.start();
worker.join();
}
}
Сначала печатается before start, затем имя
fetch-7 из задачи. Без unstarted
задача могла бы начаться раньше, чем главный поток
дойдёт до своей строки лога.
Тот же builder в одну цепочку со стартом:
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread v = Thread.ofVirtual()
.name("worker-a")
.start(() -> System.out.println("alive"));
v.join();
}
}
Для платформенных потоков есть параллельная фабрика
Thread.ofPlatform() с похожим API. Виртуальная
ветка всегда создаёт лёгкий поток, проверка
isVirtual() после старта вернёт true.
Соберите виртуальный поток с именем "io-1", запустите его вручную
и выведите из задачи isVirtual().