Thread.currentThread().getName() 对于通过 Executors.newVirtualThreadPerTaskExecutor() 创建的虚拟线程返回空字符串 ""

fas*_*cja 10 java multithreading java-19 virtual-threads

我正在使用 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");
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是:

Started with virutal threads
[] virtual task 2
[] virtual task 1
Finished
Run Code Online (Sandbox Code Playgroud)

为什么 Thread.currentThread().getName() 没有任何名称?

后续问题:如何识别彼此之间的虚拟线程?(如何识别它们)所以输出看起来像

[thread-1] virtual task 2
[thread-0] virtual task 1
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 6

太长了;博士

long threadId = Thread.currentThread().threadId() ;  // The thread ID is unique and remains unchanged during its lifetime.
Run Code Online (Sandbox Code Playgroud)

线程名称可选

任何线程的名称都是完全可选的。

如果您愿意,您可以命名一个线程。这在调试时非常方便。但您不应期望有任何预设值。

虚拟线程特别被指定为没有设置名称。引用Javadoc(我的重点):

虚拟线程默认没有线程名。如果未设置线程名称,则 getName 方法将返回空字符串。

某些框架(例如 JavaFX/OpenJFX)为其线程提供了一个信息丰富的名称。

线程ID

如果您想识别 a Thread,请使用它的 ID a long

引用Javadoc:

返回 this 的标识符Thread。线程ID是long创建该线程时生成的正数。线程 ID 是唯一的,并且在其生命周期内保持不变。