Thread.currentThread().getName() возвращает пустую строку "" для виртуальных потоков, созданных с помощью Executors.newVirtualThreadPerTaskExecutor()
Я работаю с Java 19. Я пытался использовать недавно представленные виртуальные потоки следующим образом:
public static void main(String[] args) {
System.out.println("Started with virutal threads");
try (ExecutorService virtualService = Executors.newVirtualThreadPerTaskExecutor()) {
virtualService.submit(() -> System.out.println("[" + Thread.currentThread().getName() + "] virtual task 1"));
virtualService.submit(() -> System.out.println("[" + Thread.currentThread().getName() + "] virtual task 2"));
}
System.out.println("Finished");
}
Результатом этой программы является:
Started with virutal threads
[] virtual task 2
[] virtual task 1
Finished
Почему Thread.currentThread().getName() не имеет имени?
Последующий вопрос: как идентифицировать виртуальные потоки между собой? (как их распознать). Таким образом, результат будет выглядеть так:
[thread-1] virtual task 2
[thread-0] virtual task 1
2 ответа
вр; доктор
long threadId = Thread.currentThread().threadId() ; // The thread ID is unique and remains unchanged during its lifetime.
Название темы необязательно
Имя любого потока совершенно необязательно.
Если хотите, можете назвать тему .Это может быть полезно во время отладки. Но не стоит ожидать какого-либо заданного значения.
В частности, виртуальные потоки указываются как не имеющие заданного имени. Цитируя Javadoc (мой акцент):
По умолчанию виртуальные потоки не имеют имени потока . Метод getName возвращает пустую строку, если имя потока не задано.
Идентификатор потока
Если вы хотите идентифицировать файл , используйте его идентификатор, файл .
- В Java 19+ вызовите
Thread#threadId
. - В более ранних версиях Java вызывайте
Thread#getId
Процитируем Javadoc:
Возвращает идентификатор этого
Thread
. Идентификатор потока является положительнымlong
номер, сгенерированный при создании этой темы. Идентификатор потока уникален и остается неизменным в течение всего времени его существования.
Я до сих пор не уверен, почему имя потока пусто, но решение, которое я нашел на данный момент, может заключаться в использовании ThreadFactory следующим образом:
final ThreadFactory factory = Thread.ofVirtual().name("named-thread-", 0).factory();
try (var virtualService = Executors.newThreadPerTaskExecutor(factory)) {
virtualService.submit(() -> System.out.println("[" + Thread.currentThread().getName() + "] virtual task 1"));
virtualService.submit(() -> System.out.println("[" + Thread.currentThread().getName() + "] virtual task 2"));
}
В этом случае вывод:
[named-thread-0] virtual task 1
[named-thread-1] virtual task 2