我有一个小的SpringBoot应用程序,其中包含1个RestController
,具有以下方法:
@GetMapping("/current-thread")
String currentThread() throws InterruptedException {
var msg = new Msg();
Thread.startVirtualThread(() -> {
msg.s += Thread.currentThread().toString();
}
).join();
msg.s += Thread.currentThread().toString();
return msg.s;
}
Msg
类只是字符串的包装器。 static class Msg{
String s = new String();
}
当我运行应用程序并执行以下curl命令时
curl localhost:8081/current-thread
我得到以下输出:
VirtualThread[#63]/runnable@ForkJoinPool-1-worker-1Thread[#38,http-nio-8081-exec-1,5,main]
这意味着应用程序正常工作。每个请求都会创建一个虚拟线程。
但是当我通过JFR(JDK Flight Recorder)监视此过程,并通过JMC(Java Mission Control)检查记录时,我看到平台线程,即http-nio
和ForkJoinPool-worker
线程。但我没有看到任何虚拟线程的迹象。它没有显示任何与虚拟线程相关的事件:
在JMC中没有虚拟线程事件。
我期望它显示1个VirtualThreadStart事件和1个VirtualThreadEnd事件。
我尝试从源代码构建JMC,但是我遇到了相同的问题。
我的问题:
- 我有什么遗漏的吗?
- 这个功能在JMC中不起作用吗?(我使用的是JMC 8.3.1,还从源代码本地构建了一个9.0版本。)
- 有没有解决方法?
谢谢。