我有一个小的SpringBoot应用程序,有1RestController
,方法如下:
@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飞行记录器)监视并通过JMC(Java任务控制)判断记录时,我确实看到了平台线程,即http-nio
和ForkJoinPool-worker
线程.但我没有看到任何虚拟线程的痕迹.它不显示任何与虚拟线程相关的事件:
No virtual thread events in JMC.个
我预计它会显示1个VirtualThreadStart事件和1个VirtualThreadEnd事件.
我try 从源代码开始在本地构建JMC.但我确实看到了同样的问题.
我的问题:
- 我是不是漏掉了什么?
- 这个功能在JMC中不起作用吗?(我使用的是JMC 8.3.1,还从源代码本地构建了一个版本9.0.)
- 有解决办法吗?
谢谢.