Java 19虚拟线程Thread.getName()返回空值及线程标识问题
Java 19虚拟线程调用
Thread.currentThread().getName()返回空的原因及命名方案 为什么getName()返回空字符串?
- 虚拟线程(Virtual Thread)默认不会自动分配名称,和平台线程(Platform Thread)不同,平台线程会自动生成类似
Thread-0的默认名称。 - 使用
Executors.newVirtualThreadPerTaskExecutor()创建的虚拟线程,默认名称为空字符串,因此调用getName()会返回空值。
如何区分不同的虚拟线程?
要给虚拟线程设置可区分的名称,可通过自定义虚拟线程工厂实现,利用Thread.ofVirtual()的name()方法生成带前缀和自增序号的命名规则:
批量命名方案(推荐)
修改代码如下:
public static void main(String[] args) { System.out.println("Started with virtual threads"); // 创建虚拟线程工厂:前缀为"thread-",序号从0开始自增 ThreadFactory virtualThreadFactory = Thread.ofVirtual().name("thread-", 0).factory(); // 使用自定义工厂创建ExecutorService try (ExecutorService virtualService = Executors.newThreadPerTaskExecutor(virtualThreadFactory)) { 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 virtual threads [thread-0] virtual task 1 [thread-1] virtual task 2 Finished
单个线程手动命名方案
如果需要精准控制每个线程的名称,可直接创建指定名称的虚拟线程提交:
public static void main(String[] args) { System.out.println("Started with virtual threads"); try (ExecutorService virtualService = Executors.newVirtualThreadPerTaskExecutor()) { virtualService.submit(Thread.ofVirtual().name("thread-0").unstarted(() -> System.out.println("[" + Thread.currentThread().getName() + "] virtual task 1"))); virtualService.submit(Thread.ofVirtual().name("thread-1").unstarted(() -> System.out.println("[" + Thread.currentThread().getName() + "] virtual task 2"))); } System.out.println("Finished"); }
内容的提问来源于stack exchange,提问作者fascynacja
相关产品推荐
相关产品推荐

